Michi: array geht nicht mehr nach Umsellung auf php 7.1

Hallo alle miteinander!

Ich weis nicht genau wie ich es am besten erklären soll, ich habe php von 5.6 auf 7.1 umgestellt. Bei einer array ausgabe habe ich nun ein Problem

$treffer->$table_spalten_namen[$x]

Der $treffer kommt aus meiner mysql Datenbank

und wird mit einer

while ($treffer= mysqli_fetch_object($result))

Schleife ausgegben.

hier sind die Spaltennamen drin

$table_spalten_namen[$x]

nur jetztbekomme ich folgende Fehlermeldung.

Notice: Array to string conversion in C:\xampp\htdocs\script\datei.php on line 230
Notice: Undefined property: stdClass::$Array in C:\xampp\htdocs\script\datei.php on line 230 a

auf der php 5.3 läuft es einbandfrei.

  1. Hello,

    was sagt denn var_dump() zum Inhalt der einzelnen Elemente und insbesondere der Datentypen?

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Ich weis nicht warum, aber ich vermute das meine zusammengewürfelte Array abfrage mein Problem ist.

      object(stdClass)#4 (3) {
        ["Plz"]=>
        string(5) "72280"
        ["Ort"]=>
        string(4) "Aach"
        ["ort_sort"]=>
        string(4) "aach"
      

      $treffer->$table_spalten_namen[$x]

  2. Hello,

    was steht denn in der Zeile 230 und in der davor?

    Ohne deinen Code zu kennen, kann man nur raten.

    Ich vermute, dass Du versuchst, einer (belegten) String-Variable ein Array zuzuweisen.

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. So heißen die ausgewählten Spalten auch in der Datenbank

      $table_spalten_namen = array("Ort","Plz","Gemeinde","Landkreis","Bundesland");
      

      Dann gebe ich die Titelzeile meiner Tabelle aus.

      echo '<thead>';
      $anzahl = count ( $table_spalten_namen );
      for ($x = 0; $x < $anzahl; $x++)
      {
      echo '<td id="'.$table_spalten_namen[$x].'">'.$table_spalten_namen[$x].'</td>';
      }
      echo '</thead>';
      

      Bis hier her geht es dann kommt der Inhalt

      echo '<tbody>';	
      while ($treffer= mysqli_fetch_object($result)) 
      {
      echo '<tr>';
      for ($x = 0; $x < $anzahl; $x++)
      {
      if($table_spalten_namen[$x]=='Landkreis')	
      {	
      ---->>>> Bis hier her klappt alles....
      echo '<td id="Landkreis">'.$treffer->$table_spalten_namen[$x].'</a></td>';
      }
      
      1. Also wenn ich die Variable anders zusammenbaue und aufrufe dann geht es ..

        $treffer->$table_spalten_namen[$x] (NEIN)

        $treffer->$table_spalten_namen[0] (JA)

        $treffer->Ort (JA)

        aber in $x ist der wert 0 drin.

      2. Hello,

        $table_spalten_namen = array("Ort","Plz","Gemeinde","Landkreis","Bundesland");
        

        Das Rätsel hat dedlfix gelöst. Zwei geschweifte Klammern zur Zusammenfassung des Objektes sind die Lösung.

        Aber wieso benutzt Du nicht foreach() für die Ausgabe?
        Die Ausgabe von Arrays mit for() ist relativ unsicher und unkonfortabel.

        Liebe Grüße
        Tom S.

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
  3. ich habe php von 5.6 auf 7.1

    Der $treffer kommt aus meiner mysql Datenbank

    Ok. das war es nicht. Was steht denn in $result, was in $treffer? kann es sein, dass Du irgendwo noch das alte mysql (ohne i) benutzt?

    1. Hello,

      Ich denke, Du hast ganz einfach was verpasst…

      [...]

      oder Du etwas übersehen?

      while ($treffer= mysqli_fetch_object($result))
      

      Es wird allerdings ein Objekt abgeholt. Ob es nachher auch objektorientiert weitergeht, kann ich nicht erkennen.

      Einer (belegten) String-Variable ein Array zuzuweisen hat aber schon in PHP 5.x nicht funktioniert. Man musste die Variable erst wieder auf false oder null setzen (alternativ mit unset() löschen) oder mit = array() zum leeren Array zurückverwandeln.

      Tat man das nicht, dann gab es ganau diesen Fehler. In $treffer steht also vielleicht irgendwann schon ein String drin, wenn das neue Array (bzw. hier Objekt) zugewiesen werden soll.

      Liebe Grüße
      Tom S.

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. Ich denke, Du hast ganz einfach was verpasst… [...]

        oder Du etwas übersehen?

        while ($treffer= mysqli_fetch_object($result))
        

        Ja. Du hast recht. Deshalb habe ich den Beitrag zwischenzeitlich geändert.

        Einer (belegten) String-Variable ein Array zuzuweisen hat aber schon in PHP 5.x nicht funktioniert.

        Weist Du was? Das ist mir noch nie aufgefallen. Wahrscheinlich arbeite ich einfach zu sauber. Ich schau mir das jetzt mal an.

        1. Ich denke, Du hast ganz einfach was verpasst… [...]

          oder Du etwas übersehen?

          while ($treffer= mysqli_fetch_object($result))
          

          Ja. Du hast recht. Deshalb habe ich den Beitrag zwischenzeitlich geändert.

          Einer (belegten) String-Variable ein Array zuzuweisen hat aber schon in PHP 5.x nicht funktioniert.

          Weist Du was? Das ist mir noch nie aufgefallen. Wahrscheinlich arbeite ich einfach zu sauber. Ich schau mir das jetzt mal an.

          Aha. Es kommt auf das Wie an:

          <?php
          error_reporting(E_ALL);
          
          $t1='bar';
          $t2='bar';
          $t3='bar';
          $t4='bar';
          $t5='bar';
          
          function getArr() {
              return array('foo', 'bar');
          }
          
          $t1 = ['foo', 'bar'];
          $t2 = getArr();
          $t3 = json_decode(json_encode($t2));
          $t4[0] = 'foo';
          $t4[1] = 'bar';
          $t5 = array();
          $t5[0] = 'foo';
          $t5[1] = 'bar';
          
          echo "Fertig:\nt1:";
          print_r($t1);echo "\nt2:";
          print_r($t2);echo "\nt3:";
          print_r($t3);echo "\nt4:";
          print_r($t4);echo "\nt5:";
          print_r($t5);echo "\n";
          

          Sowohl in PHP als auch in hhvm keine Notiz - obwohl eigentlich eingeschaltet! Aber das hier: (Fehlerhaftes Ergebnis ist bei t4)

          $ php /tmp/t.php 
          Fertig:
          t1:Array
          (
              [0] => foo
              [1] => bar
          )
          
          t2:Array
          (
              [0] => foo
              [1] => bar
          )
          
          t3:Array
          (
              [0] => foo
              [1] => bar
          )
          
          t4:fbr
          t5:Array
          (
              [0] => foo
              [1] => bar
          )
          

          Man kann also schon einer Variable, die einen String enthält, einen Array zuweisen. Nur eben nicht direkt Elemente eines Array adressieren, wenn der vermeintliche Array ein String ist.

          1. Tach!

            $t4='bar';
            $t4[0] = 'foo';
            $t4[1] = 'bar';
            

            Sowohl in PHP als auch in hhvm keine Notiz - obwohl eigentlich eingeschaltet! Aber das hier: (Fehlerhaftes Ergebnis ist bei t4)

            Das ist ja auch kein Fehler, sondern beschriebenes Verhalten. Der Zugriff auf einzelne Zeichen von Strings mittels []-Operator ist auch keine PHP-Besonderheit, sondern üblich in vielen Sprachen.

            t4:fbr
            

            Von den zugewiesenen Strings wird das erste Zeichen genommen, weil du ja einen Zeichenzugriff auf $t4 notiert hast.

            Man kann also schon einer Variable, die einen String enthält, einen Array zuweisen.

            Nicht nur das. Man kann (in PHP und anderen typschwachen Sprachen) jeder Variable, die einen beliebigen Wert und Typ enthält einen anderen beliebigen Wert und Typ zuweisen. Das wäre sonst etwas sehr eigenartig, wenn das nicht ginge.

            Nur eben nicht direkt Elemente eines Array adressieren, wenn der vermeintliche Array ein String ist.

            Ach!


            Zu beachten ist dabei noch, dass PHP nach wie vor Strings als single-byte-kodiert ansieht. Zugriff auf mehr-byte-kodierte Zeichen klappt auf diese Weise nicht.

            dedlfix.

            1. Sowohl in PHP als auch in hhvm keine Notiz - obwohl eigentlich eingeschaltet! Aber das hier: (Fehlerhaftes Ergebnis ist bei t4)

              Das ist ja auch kein Fehler, sondern beschriebenes Verhalten. Der Zugriff auf einzelne Zeichen von Strings mittels []-Operator ist auch keine PHP-Besonderheit, sondern üblich in vielen Sprachen.

              t4:fbr
              

              Von den zugewiesenen Strings wird das erste Zeichen genommen, weil du ja einen Zeichenzugriff auf $t4 notiert hast.

              Das stimmt ja alles. Ich sehe das so: Jemand versucht einem (vermeintlichen) Array-Element, welches aber keines ist, nur ein Zeichen verträgt, einen String mit mehr als einem Zeichen (oder Byte) zuzuweisen. Das Verhalten mag dokumentiert sein, aber wenn wie gezeigt und gut zu sehen von dem String nur das erste Zeichen genommen und der Rest ignoriert wird, also Daten ohne explizite Programmvorschrift verändert werden, dann ist mindestens eine Notiz fällig.

              Ich halte das gezeigte Verhalten auf Grund der unterbleibenden Notiz für einen Designfehler von PHP.

  4. Tach!

    ich habe php von 5.6 auf 7.1 umgestellt.

    Dazu gibt es im PHP-Handbuch Kapitel, die alle Dinge aufführen, die von Version X auf Y geändert wurden.

    Bei einer array ausgabe habe ich nun ein Problem

    $treffer->$table_spalten_namen[$x]

    Bitte schön. Setz die geschweiften Klammern so wie in der Spalte "PHP 5 interpretation" angegeben, dann wird es eindeutig, worauf sich die []-Klammern beziehen.

    dedlfix.

    1. So aus

      $treffer->$table_spalten_namen[$x]

      wird

      $treffer->{$table_spalten_namen[$x]}

      jetzt funktiniert es wieder.

      Danke für Eure Mithilfe

      Michi