Probleme mit Arrays in unterschiedlichen PHP Versionen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit Arrays in unterschiedlichen PHP Versionen

    Hallo zusammen,

    ich habe folgendes Problem:

    Folgende Funktion liest alle "Ordner" einer SQL-Tabelle "Ordner" aus meiner Datenbank:
    PHP-Code:
    function GetDir(){
        
    $vz = array();
        global 
    $idordner;
        
    $query "select * from ordner where idordnerparent = $idordner order by pos, name";
        
    $result mysql_query($query);
        if((!empty(
    $result)) && ($ds mysql_fetch_object($result))){
            do{
                echo 
    "\"$ds->name\" ";    // alles ok - hier werden alle Namen nacheinander ausgegeben!
                // also z.B. "1" "2" "3"
                
    $CurrOrdner->name $ds->name;
                
    $CurrOrdner->id $ds->idordner;
                
    $CurrOrdner->partien $ds->partien;
                
    $CurrOrdner->ordner $ds->ordner;
                
    $CurrOrdner->LastKommentar $ds->LastKommentar;
                
    $CurrOrdner->LastPartie  $ds->LastPartie;
                
    $vz[] = $CurrOrdner;
            }while(
    $ds mysql_fetch_object($result));
        }

        foreach (
    $vz as $ordner){
            echo 
    "\"$ordner->name\" ";
            
    // hier wird IMMER nur der Name (für alle Elemente!) des letzten zugefügten CurrOrdners ausgegeben
            // also z.B. "3" "3" "3"
        
    }
        return 
    $vz;

    Der Code ist eigentlich ganz einfach:
    In $CurrOrdner sammle ich die Daten pro Ordner.
    Diese Daten lege ich dann als neues Arrayelement in $vz ab.

    Wenn ich in der letzten Schleife der Funktion (testweise) die Ordnernamen ausgebe, kommt immer nur der Name des zuletzt gelesenen Ordners raus.

    Wenn also die SQL-Tabelle "ordner" die Einträge

    1
    2
    3

    als jeweiligen Ordnernamen hat,
    Wird beim Ausgeben von $vz immer nur

    3
    3
    3

    ausgegeben.

    Das Lesen aus der Datenbank funktioniert. Testweise lasse ich oben
    $ds->name
    ausgeben - und da kommt brav 1 2 3.

    Das komische: Auf meinem Testsystem ist PHP 4.3.9 installiert.
    DA FUNKTIONIERT ES!

    Auf dem "Release"-System mit PHP 5.1.5 kommt der oben beschriebene Fehler.

    Ich habe jetzt schon viel nachgeschlagen - aber keine Änderung ggü. von Array in PHP 5 gefunden. Oder mache ich grundsätzlich was falsch??

    Danke!

  • #2
    dieses objekt existiert ja auch nur einmal, wird nur immer wieder referenziert. php5 macht es richtig - lege also jedes mal ein neues objekt an, anstatt immer nur eins anzusprechen.

    Kommentar


    • #3
      Original geschrieben von penizillin
      dieses objekt existiert ja auch nur einmal, wird nur immer wieder referenziert. php5 macht es richtig - lege also jedes mal ein neues objekt an, anstatt immer nur eins anzusprechen.
      Danke für die schnelle Antwort.

      Ok - hört sich logisch an.

      Aber wie müßte ich das abändern?

      Danke!!!

      Kommentar


      • #4
        Ok - nach langem Suchen selbst gefunden:

        PHP-Code:
        function GetDir(){
            
        $vz = array();
            global 
        $idordner;
            
        $query "select * from ordner where idordnerparent = $idordner order by pos, name";
            
        $result mysql_query($query);
            if((!empty(
        $result)) && ($ds mysql_fetch_object($result))){
                do{
                    echo 
        "\"$ds->name\" ";    // alles ok - hier werden alle Namen nacheinander ausgegeben!
                    // also z.B. "1" "2" "3"
                    
        $CurrOrdner->name $ds->name;
                    
        $CurrOrdner->id $ds->idordner;
                    
        $CurrOrdner->partien $ds->partien;
                    
        $CurrOrdner->ordner $ds->ordner;
                    
        $CurrOrdner->LastKommentar $ds->LastKommentar;
                    
        $CurrOrdner->LastPartie  $ds->LastPartie;
                    
        $vz[] = clone $CurrOrdner;       // CLONE BENUTZEN!!!!!!!!!!
                
        }while($ds mysql_fetch_object($result)); 

        Kommentar


        • #5
          ein
          PHP-Code:
          $CurrOrdner = new stdClass(); 
          am Anfang der Schleife ist irgendwie sinnvoller und verhindert auch die Notice beim ersten Schleifendurchlauf (siehe error_reporting(E_ALL))

          aber naja... der Code hat wohl eh schon mal bessere Zeiten gesehen ^^;

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            warum clonst du nicht gleich das mysql objekt?
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              Original geschrieben von tontechniker
              warum clonst du nicht gleich das mysql objekt?
              oder einfach das als Referenz ins Array

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Original geschrieben von tontechniker
                warum clonst du nicht gleich das mysql objekt?
                Naja, clone gibts in PHP 4 ja nicht und deshalb dürfte es da nen dicken Fehler geben....
                Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                var_dump(), print_r(), debug_backtrace und echo.
                Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                Kommentar


                • #9
                  Original geschrieben von ghostgambler

                  aber naja... der Code hat wohl eh schon mal bessere Zeiten gesehen ^^;
                  Danke für die qualifizierte Antowort.

                  Ich komme von der C++ / C#-Schiene und kenne mich in PHP nur rudimentär aus.

                  Über eine bessere Aussage von wegen Programmierstil als die oben zitierte wäre ich schon dankbar gewesen.

                  Dumme Kommentare kannst Du Dir sparen - und wenn ja, dann wäre ein Verbesserungshinweis von wegen Programmierstil in PHP nett.
                  PHP habe ich mir "nur" aus Büchern und Foren angeeignet.

                  Ich habe den Programmierstil von C++ bzw. C# übernommen. Wenn ich da etwas besser machen kann - immer her damit.
                  Zuletzt geändert von XStone; 19.03.2007, 09:55.

                  Kommentar


                  • #10
                    PHP-Code:
                    <?php

                    function GetDir($idordner) {
                        
                    $vz = array();
                        
                    $result mysql_query("select name, partien, ordner, LastKommentar, LastPartie, idordner AS id
                    from ordner where idordnerparent = 
                    $idordner order by pos, name");
                        if (
                    mysql_num_rows($result)) {
                            while (
                    $row mysql_fetch_object($result)) {
                                
                    $vz[] = $row;
                            }
                        }
                    globale Variablen müssen nicht sein
                    die separate Speicherung vom Query in $query ... naja, wenns Spaß macht
                    das IF war das wohl tollste was ich bisher gesehen hab, erzeugte trotzdem noch ggf. einen Error, also kann man empty auch sein lassen (vor allem weil das eh nur greift, wenn die DB weg oder der Query unpassend ist und dann dürfte der eine Notice über ein kaputt übergebenes $result das kleinste Übel sein)
                    do-while zum Abrufen von Datensätzen ist irgendwie doof, wenn man bedenkt, dass jeder andere einfach nur ein while nimmt und man das aus Gründen der einfacheren Lesbarkeit dann mal einfach übernehmen sollte

                    Den Query kann man ggf. als Sternchen lassen, dann muss man sich nur damit anfreunden, dass idordner halt in $vz[x]->idordner drin ist und nicht in id ... nyo, der Rest wäre Markup, da kannst du ja machen was du willst

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      die separate Speicherung vom Query in $query ... naja, wenns Spaß macht
                      Zumindest hierzu möchte ich was sagen: Dadurch wird das Debuggen einfacher, weil man einfach echo $query; ausgeben lassen kann, wenn etwas nicht funktioniert. Inwieweit man diesen Stil aber haben möchte, ist jedem selber überlassen.

                      Ich für meinen Teil mache es auch so, dass ich den String direkt in den Funktionsaufruf mit reinschreibe. Muss nur sehr sehr selten die Query selber ausgeben lassen
                      Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
                      var_dump(), print_r(), debug_backtrace und echo.
                      Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
                      Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
                      Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

                      Kommentar


                      • #12
                        Original geschrieben von XStone
                        Ich habe den Programmierstil von C++ bzw. C# übernommen.
                        schlechte ausrede... dort wäre ein solcher if-do-while kram genauso wenig lesbar und bedingt sinnvoll. auch in diesen sprachen kann man parameter übergeben (anstatt sie global durchzuboxen). variablen mitten in einem string anzusiedeln wäre auch dort unfug.

                        Kommentar


                        • #13
                          Original geschrieben von penizillin
                          schlechte ausrede... dort wäre ein solcher if-do-while kram genauso wenig lesbar und bedingt sinnvoll. auch in diesen sprachen kann man parameter übergeben (anstatt sie global durchzuboxen). variablen mitten in einem string anzusiedeln wäre auch dort unfug.
                          Stimme ich nur bedingt zu:
                          Der "if-do-while-Kram" find ich persönlich gut. Ich hatte am Anfang auch gestutzt, bis ich in einer Vorlesung über Algorithmen und Datenstrukturen davon überzeugt wurde. Es ist - allgemein betrachtet - weniger fehleranfällig.

                          Das mit den globalen Durchrouten:
                          Da gebe ich Dir vollends Recht!

                          Kommentar


                          • #14
                            Original geschrieben von ghostgambler
                            PHP-Code:
                            <?php

                            function GetDir($idordner) {
                                
                            $vz = array();
                                
                            $result mysql_query("select name, partien, ordner, LastKommentar, LastPartie, idordner AS id
                            from ordner where idordnerparent = 
                            $idordner order by pos, name");
                                if (
                            mysql_num_rows($result)) {
                                    while (
                            $row mysql_fetch_object($result)) {
                                        
                            $vz[] = $row;
                                    }
                                }
                            globale Variablen müssen nicht sein
                            die separate Speicherung vom Query in $query ... naja, wenns Spaß macht
                            das IF war das wohl tollste was ich bisher gesehen hab, erzeugte trotzdem noch ggf. einen Error, also kann man empty auch sein lassen (vor allem weil das eh nur greift, wenn die DB weg oder der Query unpassend ist und dann dürfte der eine Notice über ein kaputt übergebenes $result das kleinste Übel sein)
                            do-while zum Abrufen von Datensätzen ist irgendwie doof, wenn man bedenkt, dass jeder andere einfach nur ein while nimmt und man das aus Gründen der einfacheren Lesbarkeit dann mal einfach übernehmen sollte

                            Den Query kann man ggf. als Sternchen lassen, dann muss man sich nur damit anfreunden, dass idordner halt in $vz[x]->idordner drin ist und nicht in id ... nyo, der Rest wäre Markup, da kannst du ja machen was du willst
                            DANKE! Das bringt mich doch schon mal wirklich nach vorne!
                            Besser als: Das geht anders viel besser.

                            Vielleicht muß ich mal ein bis ausholen:
                            Ist mein erstes """Projekt""" in php gewesen und war eigentlich nur zum Reinschnüffeln.

                            Das komplette Ergebnis ist übrigens auf
                            http://www.caissahamm.de/
                            zu sehen (dort links der Menüpunkt "Schachpartien").

                            Dein Quelltext hat mir wirklich(!) viel gebracht und zeigt mir, wie man vieles vereinfachen kann.
                            Ich hatte diese Vorgehensweise aus einem Buch und vermute jetzt einmal, dass der Autor viel Wert auf "Verstehen" statt "Optimieren" gesetzt hat.
                            Ich habe mir schon gedacht, dass vieles einfacher und besser zu optimieren ist - aber wenn man sich erst an PHP herantastet, wird man mit diesen Optimierungen (z.B. die Zeile "$vz[] = $row;") erst vertraut, wenn man viel Erfahrung gesammelt hat.

                            C++ ist ebenfalls ein schönes Beispiel dafür: Hier lassen sich oft mehrer Programmzeilen in einer zusammenfassen - auf (wie ich finde) extreme Kosten der Lesbarkeit.

                            Danke!

                            Kommentar


                            • #15
                              Original geschrieben von XStone
                              Es ist - allgemein betrachtet - weniger fehleranfällig.
                              wieso?

                              Kommentar

                              Lädt...
                              X