Karl Kowald: verschachtelte DB-Abfragen...irgendwie...

Beitrag lesen

Nabend, sitze schon den ganzen Nachmittag an einem Problem, hab jetzt seit Stunden verschiedene Lösungsideen probiert, aber ich komm einfach nicht weiter, vielleicht hat ja jemand ne Idee.

Also, eine Fussballseite hat zwei DB-Tabellen [spiele] und [spieler]. Das Skript sieht abstrahiert nun so aus:

...

(1) $spiele = "SELECT * FROM spiele"

(2) $spieler = "SELECT * FROM spieler"

(3) WHILE(LIST(...) = mysql_fetch_row($spieler)
    {
(4)  WHILE(LIST(...) = mysql_fetch_row($spiele)
    }

...

Zur Erklärung: Die beiden Tabellen werden komplett ausgelesen (1) und (2). Dann soll die Tabelle [spieler] ausgegeben werden (3). Es gibt 22 aktive Spieler, also wird die WHILE-Schleife 22 mal durchlaufen und bei jedem Aufruf soll nun auch das Ergebnis aus (1), also die Tabelle [spiele], ausgegeben werden (4).

Das Problem: So wie oben geschrieben klappt das nur beim ersten Durchlauf der äusseren WHILE-Schleife (3), danach scheint es fast so als würde das Ergebnis von (1) gelöscht. Mache ich es aber so:

....

(2) $spieler = "SELECT * FROM spieler"

(3) WHILE(LIST(...) = mysql_fetch_row($spieler)
    {
(1)  $spiele = "SELECT * FROM spiele"

(4)  WHILE(LIST(...) = mysql_fetch_row($spiele)
    }

....

dann funktioniert es tadellos. Allerdings sind das 22 DB-Abfragen und die Tabelle [spiele] ist recht gross, deshalb dauert es einige Sekunden bis die Seite da ist. Das Problem liegt also mE irgendwo daran dass das Ergebnis aus (1) nicht korrekt in die WHHILE-Schleife (3) übernommen wird. Jemand ne Idee ? Wäre echt dankbar, sonst wirds echt noch ne lange Nacht...

Das ist ganz klar: In der PHP-Beschreibung steht:

"Wiederholtes Aufrufen von mysql_fetch_row() liefert den nächsten Datensatz des Anfrageergebnisses oder FALSE, wenn keine weiteren Datensätze verfügbar sind"

D.h: sobald es einmal aufgerufen ist, bleibt der Startzeiger an der letzten Zeile, daher kann das nur einmal ablaufen.

Abhilfe wäre zb:
(1) $spiele = "SELECT * FROM spiele"
    $anzahl = mysql_num_rows($spiele);

(2) $spieler = "SELECT * FROM spieler"

(3) WHILE(LIST(...) = mysql_fetch_row($spieler)
    {
(4)  for($a = 0; $a < $anzahl; $a++)
       {
         $blub1 = mysql_result($spiele,$a,"blub1");

etc. etc...
übrigens... * ausfragen ist sowieso eine sehr aufwendige methode... zähl die spalten auf, die du wirklich brauchst, beschleunigt die abfrage auch!

MfG
  Karl