Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL result wird überschrieben

Einklappen

Neue Werbung 2019

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

  • MySQL result wird überschrieben

    Hallo zusammen

    Ich habe folgenden Code, der Daten aus einer Datenbankt liest, und diese in einer While Schleife verarbeitet. Es ist nur ein Beispielcode um das Problem darzustellen. Ich kann im Skript kein JOIN machen, da ich die einzelnen While schleifen brauche.
    PHP-Code:
    $mysql->select('*'$prefix.'option_cat'); // result 1
    echo $mysql->count().'<br />';
    while (
    $cat $mysql->fetchRow()) { // result 1
        
    echo 'x<br />';
        
    $mysql->select('id,name,value,description'$prefix.'option''WHERE cat = '.sql($cat['id'])); 
        
    // result 2
        
    echo $mysql->count().'<br />';
        while (
    $option $mysql->fetchRow()) { // result 2
            
    echo 'z<br />';
        }

    Ausgabe:
    Code:
    2
    x
    7
    z
    z
    z
    z
    z
    z
    z
    Erwartet habe ich, dass ich mindestens 2 mal ein 'x' bekomme, da ich ja auch 2 Datensätze hab.

    Der Fehler ist mir bekannt. Die methode select() ruft die Methode query() auf, welche das ergebnis in $this->result speichert. Dieses Attribut wird bei der inneren While schleife überschrieben.
    PHP-Code:
    public function query($query) {
        
    $this->result mysql_query($query,$this->connection)
            or die(
    'Error: '.mysql_error($this->connection));
        
    $this->counter=NULL;
    }

    public function 
    select($fields$table$zusatz '') {
        
    $sql "SELECT ".$fields." FROM ".$table." ".$zusatz.";";
        
    $this->query($sql);
        return 
    true;

    Meine frage ist nun, wie kann ich das so ändern, dass ich nicht überall, wo diese verschachtelte While schleife vorkommt, änderungen vornemen kann?
    Bzw. Ich will nur die Klasse bzw. die Methoden ändern.
    Habt ihr eine Idee?

  • #2
    Nimm eine andere Datenbankklasse oder lasse dir von der Funktion select die ResourceID zurückliefern. Dann lässt du fetchRow diese ResourceID als Parameter fordern.
    Ein anderer Ansatz wäre, sich ein Statement-Objekt erzeugen zu lassen, dass die Resource-ID bereits enthält. Dazu musst du entsprechend eine weitere Klasse Statement implementieren, die die Funktionen fetchRow anbietet.

    Möglichkeiten gibt es da viele.
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Zitat von Asipak Beitrag anzeigen
      lasse dir von der Funktion select die ResourceID zurückliefern. Dann lässt du fetchRow diese ResourceID als Parameter fordern.
      Das mach ich doch schon:
      PHP-Code:
      public function fetchRow() {
          return 
      mysql_fetch_assoc($this->result);

      Kommentar


      • #4
        Nein, das machst du nicht - deine select-Methode gibt true zurück.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          Insbesondere übeschreiben die Methoden interne Variablen ($this->result). Das heisst, du kannst nicht einfach 2 Queries geschachtelt abfragen, sondern benötigst 2 Objekt der Klasse...
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            lass doch deine Klasse beim mysql->select ein Resultat zurückliefern..

            meine Datenbankklasse baut im Falle einer erfolgreichen Abfrage die Ergebnisse der Datenbankabfrage in ein mehrdimensionales Array um und liefert dieses zurück - dadurch ist die Klasse quasi sofort bereit für die nächste Anfrage. Es macht wenig Sinn, das Ergebnis auch im Datenbank-Objekt kapseln zu wollen
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

            Kommentar


            • #7
              Ich danke euch, ich habs jetzt so gelöst:
              PHP-Code:
              $res_cat $mysql->select('*'$prefix.'option_cat'); // result 1
              echo $mysql->count().'<br />';
              while (
              $cat $mysql->fetchRow($res_cat)) { // result 1
                  
              echo 'x<br />';
                  
              $res_option $mysql->select('id,name,value,description'$prefix.'option''WHERE cat = '.sql($cat['id'])); 
                  
              // result 2
                  
              echo $mysql->count().'<br />';
                  while (
              $option $mysql->fetchRow($res_option)) { // result 2
                      
              echo 'z<br />';
                  }


              public function 
              select($fields$table$zusatz '') {
                  
              $this->result_counter++;
                  
              $sql "SELECT ".$fields." FROM ".$table." ".$zusatz.";";
                  
              $this->query($sql);
                  return 
              $this->result;
              }

              public function 
              fetchRow($result false) {
                  return 
              mysql_fetch_assoc($result $result $this->result);

              Ich weiss zwar nicht ob das die eleganteste lösung ist, aber sie Funktioniert.

              Kommentar

              Lädt...
              X