Yadgar: Datenbank-Ergebniszeiger zurücksetzen?

Hi(gh)!

Nach Beendigung einer while-Schleife, in der die jeweils nächste Zeile (mysql_fetch_row()) in einer mysql-Ausgabe auf bestimmte Werte geprüft wird, muss ich den Datensatz um 1 zurücksetzen. Wie mache ich das?

Ich habe in diversen PHP-Onlinehandbüchern die Funktion mysql_data_seek() gefunden, mit der man den Datensatzzeiger absolut (aber eben nicht relativ) auf einen Wert setzen kann. Dazu müsste ich aber wissen, welchen Wert dieser Zeiger aktuell hat. Wie erfahre ich das?

Zur Erläuterung hier mein Code:

  
// vorher wurde natürlich schon einmal mit $row2 = mysql_fetch_row($result2) eine Zeile abgerufen!  
  
do  
{  
  if (stristr($row2[0], ",")) // Umstellung von Familien- und Vorname, falls interviewter Interpret ein einzelner Musiker ist  
  {  
    $name = explode(", ", $row2[0]);  
    $partner = $name[1]." ".$name[0];  
  }  
  else  
  $partner = $row2[0];  
  echo $partner;  
  $row2 = mysql_fetch_row($result2); // nächster Eintrag in Interview-Liste pro Sendung  
  if ($row2[1] == $firstpartnerstart)  
    echo ", "  
}  
while ($row2[1] == $firstpartnerstart) // solange jeweils nächster Eintrag dieselbe Blockstart-Zeile hat wie der erste Partner im aktuellen Interview (also zusätzlicher Partner im selben Interview ist)  
  
            // Datenbank-Ergebniszeiger wird um eine Zeile zurück gesetzt  

Bis bald im Khyberspace!

Yadgar

Now playing: Pulstar (Vangelis)

  1. Hi,

    Ich habe in diversen PHP-Onlinehandbüchern die Funktion mysql_data_seek() gefunden, mit der man den Datensatzzeiger absolut (aber eben nicht relativ) auf einen Wert setzen kann. Dazu müsste ich aber wissen, welchen Wert dieser Zeiger aktuell hat.

    Na dann zähl doch einfach mit …?

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hi(gh)!

      Na dann zähl doch einfach mit …?

      Funktioniert aus irgendeinem Grund nicht - mysql_data_seek() liefert immer FALSE!

      Hier der Code:

        
      $query = "SELECT interpret.Name, sendung.Datum, interview.NachZeile, interview.BisZeile, interview.Teil FROM interpret, sendung, interview, interview_interpret WHERE sendung.Datum = '".mysql_real_escape_string($datum[$i])."' AND interview.Sendung = sendung.ID AND interview_interpret.Interview = interview.ID AND interview_interpret.Interpret = interpret.ID ORDER BY NachZeile";  
        
      $result2 = mysql_query($query);  
      dberror();  
      $row2 = mysql_fetch_row($result2);  
      $row2count = 1; // erste Zeile wurde abgefragt, also steht der Zähler jetzt bei 1  
        
      [...]  
        
      $blocks = false;  
      $r = 0; // Einzeltitel-Zeile innerhalb einer Sendung  
      while ($row = mysql_fetch_row($result))  
      {  
        $r++;  
        echo $row2count."<br>";  
        if ($row2[0] != NULL && $r == $row2[2]+1) // falls Sendung Interview enthält  
        {  
          switch ($datum[$i])  
          {  
            case "1988-09-08":  
              $partner = $row2[0]." & Büdi Siebert";  
            break;  
            case "1988-09-15":  
              $partner = $row2[0]." = Hubert Bognermayr, Harald Zuschrader, Josef Resl";  
            break;  
          }  
          if ($r > 1) // Leerzeile vor Interview-Block, falls nicht am Anfang der Sendung  
          {  
            echo '<tr><td colspan="3">&nbsp;</td></tr>';  
          }  
          $firstpartnerstart = $row2[2]; // Block-Start für ersten Partner im aktuellen Interview  
          echo '<tr><td colspan="3">Interview mit ';  
          do  
          {  
            if (stristr($row2[0], ",")) // Umstellung von Familien- und Vorname, falls interviewter Interpret ein einzelner Musiker ist  
            {  
              $name = explode(", ", $row2[0]);  
              $partner = $name[1]." ".$name[0];  
            }  
            else  
            $partner = $row2[0];  
            echo $partner;  
            $row2 = mysql_fetch_row($result2); // nächster Eintrag in Interview-Liste pro Sendung  
            $row2count++;  
            if ($row2[2] == $firstpartnerstart)  
              echo ", ";  
          }  
          while ($row2[2] == $firstpartnerstart); // solange jeweils nächster Eintrag dieselbe Blockstart-Zeile hat wie der erste Partner im aktuellen Interview (also zusätzlicher Partner im selben Interview ist)  
        
          mysql_data_seek($result2, $row2count-1); // Datenbank-Ergebniszeiger wird um eine Zeile zurück gesetzt  
          // $row2 = mysql_fetch_row($result2);  
        
        
          if ($row2[4] != NULL) // falls Interview mehrteilig (d. h. über mehrere Sendungen verteilt)  
            echo ", Teil ".$row2[4];  
          echo "</td></tr>";  
        }  
       if (strpos($row3[0], "Auswertung")) // Sonderregelung für Sendungen mit Ergebnissen von Schwingungen-Wahlen  
         $blocks = true;  
         if ($blocks)  
         {  
           [...]  
         }  
         else  
           echo '<tr><td>'.$row[0].'</td><td>'.$row[1].'</td><td>'.$row[2]; // normale Ausgabe einer Zeile mit Intepret, Tonträger und Titel  
        
         [...]  
         if ($row2[3] < $row5[0] && $r == $row2[3])  
         // if ($r < $row5[0] && $r == $row2[3])  
         {  
           echo '<tr><td colspan="3">&nbsp;</td></tr>'; // Leerzeile, falls nach einem Interview-Block noch andere Titel folgen  
           $row2 = mysql_fetch_row($result2); // nächstes Interview in der Sendung, sofern vorhanden  
           $row2count++;  
         }  
         $row3 = mysql_fetch_row($result3); // nächste Sonderzeile, sofern vorhanden  
         echo "</td></tr>"; // schließende Tags der Tabellenzeile  
       }  
        
        
      
      
      1. Meine Herren,

        Hi(gh)!

        Na dann zähl doch einfach mit …?

        Funktioniert aus irgendeinem Grund nicht - mysql_data_seek() liefert immer FALSE!

        Du zählst ja auch falsch, bei jedem mysql_fetch*-Aufruf musst du hochzählen.
        Im übrigen tust dich glaube ich unnötig schwer. Packe die Daten doch vorher in eine Datenstruktur (zum Beispiel ein Array) mit dem du einfacher arbeiten kannst.

        $data = array();  
        while ( $dataset = mysql_fetch_row( $res ) ){  
           $data[] = $dataset;  
        }
        

        Dann kannst du sogar die nützlichen Funktion array_map oder array_reduce nutzen. Damit wird dein Code imho. expressiver.

        1. Hi(gh)!

          Du zählst ja auch falsch, bei jedem mysql_fetch*-Aufruf musst du hochzählen.

          Wieso, mache ich doch! Natürlich nur nach mysql_fetch_row($result2), denn es geht ja nur um die Query für die Interview-Partner!

          Bis bald im Khyberspace!

          Yadgar

          1. Meine Herren,

            Du zählst ja auch falsch, bei jedem mysql_fetch*-Aufruf musst du hochzählen.

            Wieso, mache ich doch! Natürlich nur nach mysql_fetch_row($result2), denn es geht ja nur um die Query für die Interview-Partner!

            Entschuldige, du hast recht, da war ich zu voreilig. $result, $result2 usw. sind aber zu meiner Verteidigung auch nicht besonders ausdrucksstarke Bezeichner. Darüberhinaus bleibt mein Rat, zu einer einfacheren Datenstruktur zu wechseln, bestehen.

            1. Hi(gh)!

              Entschuldige, du hast recht, da war ich zu voreilig. $result, $result2 usw. sind aber zu meiner Verteidigung auch nicht besonders ausdrucksstarke Bezeichner. Darüberhinaus bleibt mein Rat, zu einer einfacheren Datenstruktur zu wechseln, bestehen.

              Habe ich mittlerweile gemacht, $result2 in ein "normales" Array eingelesen... und damit klappt es einwandfrei! Danke für den Tipp, habe dich in meinen Credits im Skript erwähnt!

              Trotzdem verstehe ich nicht, wieso mysql_data_seek() nicht vernünftig funktioniert... könnte es sein, dass der Index tatsächlich ausnahmsweise bei 1 und nicht bei 0 beginnt, dies aber falsch dokumentiert ist?

              Bis bald im Khyberspace!

              Yadgar

              1. Meine Herren,

                Danke für den Tipp, habe dich in meinen Credits im Skript erwähnt!

                Ich weiß das sehr zu schätzen und versteh mich bitte nicht falsch, wenn ich dich bitte den Vermerk wieder zu entfernen. Ich fühle mich geschmeichelt, aber ich habe gerne Kontrolle darüber unter welchen Projekten mein Name auftaucht, u.a. auch weil mein Arbeitsvertrag mir die Ausübung konkurrierender Tätigkeiten untersagt.