Andrea Johanna: javascript und php - plötzlich fatal error

Hallo, bin gerade auf ein Problem gestossen und komm nicht weiter… habe mehrere php Seiten auf denen über include() Dateien eingebunden sind. Eine dieser include dateien enthält ein javascript für dropdown menue - die options werden über php gefüllt. Wenn ich die Seiten normal aufrufe ist alles ok, auch verlinkt funktioniert alles. Jetzt habe ich eine Seite mit einem Formular zum Bearbeiten von Datenbankinhalten. Diese Seite wird normal aufgerufen, fuktioniert. Wenn ich allerdings das Formular abschicke wird zwar der DB update gemacht, aber die Seite wird mir nicht mehr geladen (habe schon versucht auf andere folge Seiten zu verweisen, das gleiche Spiel). Im Quelltext wird mir folgende Fehlermeldung ausgegeben:

<b>Fatal error</b>: [] operator not supported for strings in <b>G:\meinewebsite\include\head.php</b> on line <b>20</b><br />

in der head.php steht an dieser Stelle

$info[]=array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

sprich ich fülle hier ein Array innerhalb einer while Schleife - und später übergebe ich das in das Javascript. Ich kapier das Problem nicht. Das exakt selbe Script funktioniert ohne Probleme, auch wenn ich andere DB Abfragen vorher mache, oder neue Datensätze anlege, sobald ich allerdings einen Datensatz bearbeite und diese Bearbeitung eintrage kommt der Fatal Error. Kann es daran liegen, dass ich einen Texteditor (CKEditor) verwende um die Textfelder in der DB zu bearbeiten? Falls ja, auf was muss ich achten, dass das Script trotzdem funktioniert.

Bin am verzweifeln.…

  1. Tach!

    <b>Fatal error</b>: [] operator not supported for strings in <b>G:\meinewebsite\include\head.php</b> on line <b>20</b><br />

    in der head.php steht an dieser Stelle

    $info[]=array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

    Ich kapier das Problem nicht.

    Debugging kann dabei helfen. Offensichtlich ist in einer der Variablen nicht das enthalten, was du erwartet hast. Also frag mal mit var_dump() deren Inhalt ab.

    dedlfix.

  2. Hey,

    <b>Fatal error</b>: [] operator not supported for strings in <b>G:\meinewebsite\include\head.php</b> on line <b>20</b><br />

    Die Meldung sagt also das [] als operator in Strings nicht zulässig ist. Also wird das:

    $info[]=array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

    als String interpretiert. Oder sehe ich das falsch?

    Wäre vllt:

    $info = array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

    oder

    $info = []; $info['Lid'] = $haus["Lid"]; $info['name'] = $haus["name"];

    besser? Bzw, warum ein neues Array wenn die Daten schon in $haus drin stehen?

    Was passiert denn da noch?

    Gruß
    Jo

  3. Hello,

    Im Quelltext wird mir folgende Fehlermeldung ausgegeben:

    <b>Fatal error</b>: [] operator not supported for strings in <b>G:\meinewebsite\include\head.php</b> on line <b>20</b><br />

    in der head.php steht an dieser Stelle

    $info[]=array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

    Dann steht in $info bereits ein Skalar oder ein String drin. Die Fehlermeldung sagt: es steht ein String drin.

    An einen String kann man (sicherheitshalber) mit dem []-Operator keine Zeichen anhängen. Das muss man mit dem Punkt-Operator tun. Aber das wolltest Du ja auch nicht. Du wolltest ja einen zusätzlichen Eintrag ins Array $info schreiben - nur dass das eben keins ist.

    ### leeres Array anlegen
    $info = array();
    
    $info[] = 'erste Fehlermeldung';
    $info[] = 'zweite Fehlermeldung';
    
    

    Das ist der Fluch der impliziten Deklaration. Lieber immer alle Variablen vorher gezielt mit dem passenden Typ erzeugen!

    Liebe Grüße
    Tom S.

    --
    Die Krawatte ist das Kopftuch des Westens
    1. Hey,

      An einen String kann man (sicherheitshalber) mit dem []-Operator keine Zeichen anhängen. Das muss man mit dem Punkt-Operator tun. Aber das wolltest Du ja auch nicht. Du wolltest ja einen zusätzlichen Eintrag ins Array $info schreiben - nur dass das eben keins ist.

      Stimmt, da hatte ich garnicht dran gedacht.

      ### leeres Array anlegen
      $info = [];
      
      $info[] = 'erste Fehlermeldung';
      $info[] = 'zweite Fehlermeldung';
      
      

      Das ist der Fluch der impliziten Deklaration. Lieber immer alle Variablen vorher gezielt mit dem passenden Typ erzeugen!

      ...und Syntax.

      Gruß
      Jo

  4. Hallo,

    der genannte Fehler kann zwei Quellen haben. Entweder ist in $info kein Array, sondern ein String, oder aber dein $haus-Array ist einer. Dein $info-Array wirst Du vermutlich vor der Schleife erzeugt haben, daher hätte ich das $haus Array eher im Verdacht. Wo kommt das her?

    Unabhängig davon wurde die Frage nach der Sinnhaftigkeit des Kopiervorgangs ja schon gestellt. Das, was Du da machst, ist in SQL-Sprech eine Projektion - ist die wirklich nötig? Wird das $info-Array nachher aus dem Dunstkreis deines PHP-Scripts hinausgereicht, dass Du die $haus-Einträge projizieren und klonen musst? Kannst Du nicht statt dessen einfach das $haus-Array verwenden?

    Rolf

    1. Hello,

      der genannte Fehler kann zwei Quellen haben. Entweder ist in $info kein Array, sondern ein String, oder aber dein $haus-Array ist einer. Dein $info-Array wirst Du vermutlich vor der Schleife erzeugt haben, daher hätte ich das $haus Array eher im Verdacht. Wo kommt das her?

      Wenn $haus kein Array wäre gäbe es den Fehler Warning: Illegal string offset

      Wenn das angesprochene Element in $haus fehlen würde, gäbe es den Fehler Notice: Undefined index:

      Es wird schon der String in $info sein, der sich weigert, als Array behandelt zu werden.

      Liebe Grüße
      Tom S.

      --
      Die Krawatte ist das Kopftuch des Westens
  5. Erstmal danke an alle! Viele Ansatzpunkte - muss ich mal durchgehen. Was mir aber immer noch ein Rätsel ist, warum das Script eigentlich tadellos funktioniert. Die og. Probleme sollten doch jedes mal auftreten wenn das Script aufgerufen wird, aber dem ist nicht so. Der Fehler wird nur gemeldet wenn ich einen Eintrag update in der Datenbank mache. Nicht wenn ich einen neuen Eintrag anlege oder sonst was auf der Seite veranstalte (das Script wird auf jeder Seite aufgerufen). Wenn ich mir vor dem Fatal Error ein Link einbaue (nicht schön und so sollte es auch nicht sein) und ich die Seite dann per click neu lade läuft das Script wieder problemlos. Dabei hat der Eintrag nicht mal Auswirkungen auf den Inhalt der für das Script aufgerufen wird sondern behandelt eine ganz andere Tabelle…

    Zu var_dump: habe ich versucht, soweit ich sehen kann wird das übergeben was übergeben werden soll.

    Andrea, noch immer am Rätseln

    1. Tach!

      Was mir aber immer noch ein Rätsel ist, warum das Script eigentlich tadellos funktioniert.

      Die Frage klärt sich erst, wenn du die eigentliche Ursache gefunden hast.

      Die og. Probleme sollten doch jedes mal auftreten wenn das Script aufgerufen wird, aber dem ist nicht so. Der Fehler wird nur gemeldet wenn ich einen Eintrag update in der Datenbank mache. Nicht wenn ich einen neuen Eintrag anlege oder sonst was auf der Seite veranstalte (das Script wird auf jeder Seite aufgerufen).

      Das ist nicht die Ursache, an der du forschen musst. Sie versteckt sich vielmehr in der folgenden Verarbeitung.

      Wenn ich mir vor dem Fatal Error ein Link einbaue (nicht schön und so sollte es auch nicht sein) und ich die Seite dann per click neu lade läuft das Script wieder problemlos. Dabei hat der Eintrag nicht mal Auswirkungen auf den Inhalt der für das Script aufgerufen wird sondern behandelt eine ganz andere Tabelle…

      Auch das ist erstmal nicht weiter relevant für das eigentliche Problem. Selbst wenn das Script unter bestimmten Umständen fehlerfrei arbeitet, ist da immer noch der eigentliche Fehler drin, der in besonderen Situationen zutage tritt.

      Zu var_dump: habe ich versucht, soweit ich sehen kann wird das übergeben was übergeben werden soll.

      Wenn selbst in $info das drin ist, was du erwartest, wie kann dann der Fehler auftreten? Oder hast du da gar nicht geschaut? Arbeite dich lieber rückwärts vom Fehler ausgehend zu seiner Ursache vor.

      dedlfix.

      1. doch ich habe den var_dump mit $info gemacht und habe das bekommen was ich erwartet habe - zumindest bei laufenden Script. Wenn das Script nicht läuft bekomme ich auch kein $info.

        1. Tach!

          doch ich habe den var_dump mit $info gemacht und habe das bekommen was ich erwartet habe - zumindest bei laufenden Script. Wenn das Script nicht läuft bekomme ich auch kein $info.

          Nun, wenn im Falle des Fehlers in $info das erwartete Array ist, das du zu ergänzen versucht, wie soll dann PHP einen String erkennen, den es ankreidet? Und was meinst du mit dem der Aussage zu dem nicht laufenden Script? Wenn es nicht läuft, kann ja auch kein Fehler auftreten. Das ist soweit logisch.

          dedlfix.

        2. Hello,

          doch ich habe den var_dump mit $info gemacht und habe das bekommen was ich erwartet habe - zumindest bei laufenden Script. Wenn das Script nicht läuft bekomme ich auch kein $info.

          Wenn ich das richtig verstanden habe, weißt Du doch schon, wie Du das Skript zum Absturz bringen kannst, oder?

          Dann musst Du jetzt nur die Variable $info abfragen mit var_dump(), bevor der Fehler auftritt. Danach geht ja nicht mehr! Also setze das var_dump() vor die betroffene Zeile und bring das Skript zum Absturz.

          Liebe Grüße
          Tom S.

          --
          Die Krawatte ist das Kopftuch des Westens
          1. Wie mache ich das? wenn ich var_dump() vor die Zeile

            $info[]=array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

            setze gibt es doch noch gar kein $info - was soll mir ausgegeben werden? Setze ich es nach der Zeile ist der Fatal Error da. Anscheinend habe ich ein riesiges Brett vorm Kopp - hat mal jemand ne Zange da damit ich die Nägel rausziehen kann.

            1. Wie jetzt, es gibt kein $info ? Um $info[] = blablabla ausführen zu können, muss $info in dem Moment ein Array enthalten. Nicht Zahl, nicht String, und keinesfalls undefined, nein, ein Array muss es sein. Und das sollte var_dump dir ausgeben.

              Ein leeres Array sähe so aus:

              array(0) {
              }
              

              Ein Array mit was drin zum Beispiel so:

              array(1) {
                [0]=>
                array(2) {
                  ["Lid"]=>
                  int(1)
                  ["name"]=>
                  string(4) "Rolf"
                }
              }
              

              Was Du keinesfalls finden solltest, wäre eins von diesen:

              NULL
              int(0)
              string(0)
              

              Rolf

              1. aber das ist es ja, ich bekomme gar nichts, null, nada anscheinend wird das [] nach $info bemängelt, das Array also gar nicht initialisiert, ausgeführt, befüllt oder was auch immer die Terminologie ist. Wenn die Inhalte des Arrays bemängelt würden dann müsste ich irgendeine rückmeldung bekommen aber hier geschieht nichts.

                So und nun habe ich mir das Script anscheinend total zerschossen mit dem vielen Rumexperimentieren, sch* ich fahr den Computer runter habe die SChn* voll für heute Trotzdem vielen Dank euch für eure Geduld, Anregungen und Hilfestellungen - vielleicht klappts ja morgen wieder besser.

                1. Wenn ich mir deinen letzten Text anschaue, warst Du gestern offenbar im mentalen Tunnel. Feierabend machen ist da die beste Idee. Hoffentlich bist Du nun wieder ruhiger und HOFFENTLICH hast Du ein Backup des Scripts gemacht, bevor Du angefangen hast, daran zu werkeln.

                  Ich bin mir jetzt nicht mehr sicher, ob Du verstanden hast, was var_dump tut. Dass es NICHTS ausgibt, sollte nicht passieren. Hast Du

                  var_dump();
                  

                  oder

                  var_dump($info);
                  

                  geschrieben?! Ruft man var_dump() ohne Parameter auf, gibt PHP eine Warnung aus und macht weiter. Wenn Warnungen bei Dir unterdrückt werden, könnte das diesen "Da passiert gar nichts" Effekt bewirken.

                  Aber letztlich doktern wir an einem Symptom herum. Es gibt ja offenbar Fälle, wo alles funktioniert. Du musst also herausfinden, ob dein Code irgendwo eine Initialisierung von $info als Array enthält, und dann, warum er dort nicht hinkommt. Sprich: Du musst rauskriegen, welchen Weg die Programmausführung in deinem Script nimmt, wenn es gut geht, und welchen Weg, wenn es schiefgeht. Isoliert die Stelle mit der Befüllung von $info zu betrachten nützt vermutlich nichts.

                  Wenn Du keinen PHP Debugger hast, mit dem Du durch das Script durchsteppen kannst, wirst Du das Script mit ein paar ECHOs versehen müssen, die Dir sagen, wo es gerade ist. BACKUP NICHT VERGESSEN! Und vor den ECHOs musst Du Dir Gedanken gemacht haben, wo es denn hingekommen sein SOLLTE. Sonst baust Du viel zu viele ein.

                  Rolf

              2. Hello,

                lies bitte mal den Abschnitt vom []-Operator im Kapitel über Arrays

                Was da steht über PHP ab Version 7.1.0 galt früher auch schon mal. Dass das zwischendurch nicht mehr gegolten haben soll, ist mir entgangen.

                Umgewandelt in ein Array wurden nur 'false' und NULL.

                Liebe Grüße
                Tom S.

                --
                Die Krawatte ist das Kopftuch des Westens
            2. Tach!

              Wie mache ich das? wenn ich var_dump() vor die Zeile

              $info[]=array('Lid'=>$haus["Lid"],'name'=>$haus["name"]);

              setze gibt es doch noch gar kein $info - was soll mir ausgegeben werden?

              Genau das ist die Frage, die dir var_dump($info) klären soll. Wenn es nicht da ist, dann gibt es als Ausgabe NULL und eine Notice, dass $info nicht existiert. Falls die Ausgabe von Notice-Meldungen nicht deaktiviert ist. Ansonsten mal das error_reporting auf E_ALL stellen (und display_errors auf on).

              Wenn es nicht da ist, dann sollte es aber auch die Meldung nicht geben. Wenn es sie also gibt, dann ist es anscheinend doch da. Und wenn du dir anschaust, was da nun ausgegeben wird, mag es dir vielleicht anhand des Inhalts auffallen, wo es herkommen könnte.

              "info" ist ein so nichtssagender Bezeichner für eine Variable und ein Allerweltswort noch dazu. Da besteht durchaus die Möglichkeit, dass man diesen Bezeichner an anderer Stelle ebenfalls schon verwendet hat. Eine genauere Bezeichnung von Variablen nach ihrem Inhalt - und da dürfen Namen schon des Verständnisses wegen ruhig auch mal etwas ausführlicher sein - sind von sich aus schon eindeutiger und weniger kollisionsgefährdet.

              Anscheinend habe ich ein riesiges Brett vorm Kopp - hat mal jemand ne Zange da damit ich die Nägel rausziehen kann.

              Es ist bei der Suche nach einem Fehler nicht hilfreich, von Annahmen auszugehen und dann bestimmte Dinge als gegeben vorauszusetzen. Stattdessen sollte man soviel prüfen, wie möglich. Auch ob Dinge nicht da sind, die man an der Stelle nicht erwartet. Und noch besser ist es, Dinge, die nicht da sind vor der ersten Verwendung definiert zu initialisieren.

              Ein $array[] = ... ist nicht nur ein schreibender Vorgang, sondern auch ein lesender. Von etwas lesen zu wollen, das nicht da ist, wird in anderen Systemen deutlicher mit Fehlern bestraft. PHP jammert da nur ganz leise mit einer Notice-Meldung, deren Ausgabe üblicherweise unterdrückt ist. Das error_reporting für die Entwicklung auf E_ALL zu stellen, hilft, solche Zugriffe auf nicht initialisierte Dinge zu finden. Die fallen einem dann sonst auf die Füße, falls sie doch schon initialisiert sind - so wie vermutlich in deinem Fall.

              dedlfix.

              1. So, jetzt wollte ich mich nochmal in Ruhe hinsetzen und das Problem neu angehen - und siehe da, das Problem scheint verschwunden (hoffe mal für immer, traue der Sache aber noch nicht).

                Übrigens: Das Zerschießen des Scripts lag Gott sei Dank nur daran, dass ich an einer Stelle versehentlich das "php" von <?php gelöscht hatte - ist mir gestern abend nicht aufgefallen, war aber auch echt frustiert und genervt.

                Nichtsdestotrotz würde ich gerne wissen was da falsch gelaufen ist und warum es jetzt wieder läuft - und ja var_dump hatte ich natürlich mit $info als Parameter angegeben (wobei ich es ehrlich gesagt in meiner Verzweiflung so ziemlich alles probiert habe was mir eingefallen ist). Wieso mir nichts ausgegeben wurde - nicht mal eine Fehlermeldung ist mir ein Rätsel. Jetzt läuft das Script und var_dump gibt mir die zu erwartende Ausgabe.

                Vielen Dank euch allen für die Hilfestellungen! Ich bin so frech und melde mich wieder, falls das Problem erneut auftritt.

                LG Andrea