Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] mysql_fetch_object: Problem bei Methodenaufruf

Einklappen

Neue Werbung 2019

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

  • [Erledigt] mysql_fetch_object: Problem bei Methodenaufruf

    Zunächst der vereinfachte Quellcode:

    PHP-Code:
    class Test{

        private 
    $content = array();

        [...]

        private function 
    fetchContent(){
            [...]
            while(
    $test_zwei mysql_fetch_object($result,  'Testzwei')){
                
    $this->setContent($test_zwei);
            }
        }

        private function 
    setContent($content){
            if(
    is_object($content)){
                
    $this->content[] = $content;
            }
        }


    PHP-Code:
    class Testzwei{
        private 
    $content null;

        public function 
    __construct(){}
        
        public function 
    initialise(){
            
    $this->fetchContent();
            
            return 
    $this;
        }

        private function 
    fetchContent(){
            
    $this->setContent('fooBar');
        }

        private function 
    setContent($content){
            
    $this->content $content;
        }

    Das Problem:
    Führe ich den Code wie oben beschrieben aus, werden dem Array $content z.B. bei zwei Ergebnissen der Db-Abfrage zwei Objekte 'Testzwei', mit content = null hinzugefügt. Ändere ich nun die Methode fetchContent im Objekt Test wie folgt ab,

    PHP-Code:
        private function fetchContent(){
            [...]
            while(
    $test_zwei mysql_fetch_object($result,  'Testzwei')){
                
    $this->setContent($test_zwei->initialise());
            }
        } 
    wird im Array $content nur $content[0] = 'fooBar' eingetragen anstatt: $content[0] = 'fooBar' und $content[1] = 'fooBar'. Auch der Konstruktor von Testzwei wird jetzt nur noch einmal aufgerufen. Ich weis aber nicht warum, und wie man trotz des Aufrufs der Methode initialise() setContent für jede Ergebniszeile der Datenbank bekommt.

  • #2
    Du willst also am Ende 1 Objekt haben mit dem property content, welches ein Array ist?

    Klasse Test
    PHP-Code:
        private function fetchContent(){
            [...]
            
    $test_zwei = new Testzwei();
            while(
    $res mysql_fetch_array($result)){
                
    $test_zwei ->setContent($res["content"]);
            } 
    Klasse Testzwei
    PHP-Code:
        private function setContent($content){
            
    $this->content[] = $content;
        } 

    Kommentar


    • #3
      Achso nein, das eigentliche Ziel ist ein Objekt Test mit der property content als Array das mehrere Objekte Testzwei, mit unterschiedlichen eigenschaften besitzt.

      Code:
      object Test{
       private Array content
        [0] => object Testzwei{
          private content = fooBar
        }
        [1] => object Testzwei{
          private content = fooBar
        }
      }

      Kommentar


      • #4
        Zitat von tramp Beitrag anzeigen
        Auch der Konstruktor von Testzwei wird jetzt nur noch einmal aufgerufen. Ich weis aber nicht warum, und wie man trotz des Aufrufs der Methode initialise() setContent für jede Ergebniszeile der Datenbank bekommt.
        Klingt beinahe so, als würde das Objekt wiederverwendet, das mysql_fetch_object() zurückliefert...

        Kommentar


        • #5
          Das vermute ich auch, nur ist dann unerklärlich ist dann nur warum bei der Zuweisung ohne initialise() zwei Objekte in dem array sind die je eine andere Objekt-Id haben. Habe es auch schon mit clone und einer tmp variable versucht, jedoch bleibt das ergebnis immer das selbe.

          Kommentar


          • #6
            das Problem ist ...

            PHP-Code:
            while($test_zwei mysql_fetch_object($result,  'Testzwei')){
                        
            $this->setContent($test_zwei->initialise()); 
            du rufst die Methode initialise() von $test_zwei auf - ..aber $test_zwei ist ein generisches Object , erzeugt durch die mysql_fetch_object-Methode .,. die hat mW gar kein "initialise() .. sondern nur properties, die aus den Datenwerten der Datenbank-Abfrage resultieren...

            du musst also vielmehr in deiner setContent-Methode das Array bei nichtvorhanden erzeugen - und dann die Objecte anfügen

            aus der mysql_fetch_object -Methode resultiert keinesfalls DIREKT ein Object von deiner Class Testzwei

            Kommentar


            • #7
              Warum wird für die erste Ergebniszeile dann das Objekt mit der Methode initialise() korrekt ausgeführt? Denn da läuft es ja korrekt - nur sobald zwei oder mehr Einträge in der Db vorhanden sind wird immer nur für die erste Zeile als Objekt ins Array eingetragen.

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                aus der mysql_fetch_object -Methode resultiert keinesfalls DIREKT ein Object von deiner Class Testzwei
                Hab ich zwar grad das erste Mal gemacht, funktioniert mit dem zweiten Parameter für mysql_fetch_object() aber so wie erwartet

                PHP-Code:
                <?php

                    mysql_connect
                'localhost''root''' );
                    
                mysql_select_db'test' );

                    class 
                Person {

                        function 
                __construct(){

                            
                $this->fullname();

                        }

                        function 
                fullname(){

                            
                $this->fullname $this->Nachname ', ' $this->Vorname;

                        }

                    }

                    
                $query mysql_query'SELECT Vorname, Nachname FROM Person' );
                    while( 
                $Person mysql_fetch_object$query'Person' ) ){ $Personen[] = $Person; }

                    
                print_r$Personen );
                Code:
                Array
                (
                    [0] => Person Object
                        (
                            [Vorname] => peter
                            [Nachname] => müller
                            [fullname] => müller, peter
                        )
                
                    [1] => Person Object
                        (
                            [Vorname] => uwe
                            [Nachname] => meier
                            [fullname] => meier, uwe
                        )
                
                )

                Kommentar


                • #9
                  Das das funktioniert habe ich ja beschrieben, aber jetzt probier das mal so:

                  PHP-Code:
                  <?php

                      mysql_connect
                  'localhost''root''' );
                      
                  mysql_select_db'test' );

                      class 
                  Person {

                          function 
                  __construct(){}

                          function 
                  fullname(){

                              
                  $this->fullname $this->Nachname ', ' $this->Vorname;
                              return 
                  $this;
                          }

                      }

                      
                  $query mysql_query'SELECT Vorname, Nachname FROM Person' );
                      while( 
                  $Person mysql_fetch_object$query'Person' ) ){ $Personen[] = $Person->fullname(); }

                      
                  print_r$Personen );

                  Kommentar


                  • #10
                    Ergibt bei mir das selbe Ergebnis. Auch nach der Zuweisung sind alle Methoden verfügbar

                    PHP-Code:
                    <?php

                        mysql_connect
                    'localhost''root''' );
                        
                    mysql_select_db'test' );

                        class 
                    Person {

                            function 
                    __construct(){}

                            function 
                    fullname(){

                                
                    $this->fullname $this->Nachname ', ' $this->Vorname;
                                return 
                    $this;
                            }

                        }

                        
                    $query mysql_query'SELECT Vorname, Nachname FROM Person' );
                        while( 
                    $Person mysql_fetch_object$query'Person' ) ){ $Personen[] = $Person; }
                        
                        
                    $Personen]->fullname();

                        
                    print_r$Personen );
                    Code:
                    Array
                    (
                        [0] => Person Object
                            (
                                [Vorname] => peter
                                [Nachname] => müller
                                [fullname] => müller, peter
                            )
                    
                        [1] => Person Object
                            (
                                [Vorname] => uwe
                                [Nachname] => meier
                            )
                    
                    )

                    Kommentar


                    • #11
                      Du hast recht vielen dank, durch deine Beiträge bin ich darauf gekommen das der Fehler in der Rückgabe meiner Db Klasse liegt. Vielen Dank.

                      *Close*

                      Kommentar

                      Lädt...
                      X