Schleife - Problem

Sasser

Erfahrenes Mitglied
Guten Morgen ;)

Ich habe eine Schleife, welche ich mit folgendem SQL-Code ausführe:

PHP:
Select * FROM fights, citys WHERE (fights.attacker = citys.coordinates OR fights.defender = citys.coordinates) AND citys.user = '$user'

Wenn nur EIN Datensatz vorhanden ist, funktioniert es wunderbar. Wenn nun allerdings ZWEI oder mehr vorhanden sind, dann bekomme ich z.B. per

PHP:
echo $row [id];

komischerweise das Ergebnis des ersten Datensatzes, obwohl die Schleife bereits beim zweiten Datensatz ist!

Was mache ich falsch?
 
Ich glaube nicht, das jemand Lust hat, einen Quelltext von 1000 Zeilen durchzugehen ...

Also ist der Fehler hier schon einmal nicht zu suchen?
 
Mag sein. Wichtig sind die Stellen:
  • Wie wird $user definiert? (kurz und knapp)
  • Wo wird der SQL-Befehl gebildet?
  • Wo wird er ausgeführt?
  • Welche Art von Schleife wird benutzt?
  • An welcher Stelle in der Schleife wird auf den Result zugegriffen?
  • An welcher Stelle wird die nächste Zeile geholt?
  • An welchen Stellen wird mit der Zeile gearbeitet?

Eventuell versteckt sich der Fehler sogar noch dahinter, was aber unwahrscheinlich ist.
 
Hi! ich danke dir schonmal!

Also die Schleife wird folgendermaßen gebildet:

PHP:
$db = connect_db ();
$result = mysql_query ( "Select * FROM fights, citys WHERE (fights.attacker = citys.coordinates OR fights.defender = citys.coordinates) AND citys.user = '$user'", $db );
mysql_close ( $db );
while ( $row = mysql_fetch_assoc ( $result ) ) {

# Operation

}

Das Problem tritt nur auf, wenn er die Schleife zwei mal durchläuft.
Und das komische ist, dass er die komplette Operation in der Schleife nur das erste mal komplett ausführt und beim zweiten Mal nicht komplett...
 
Zuletzt bearbeitet:
Das mag an dem Offset von mysql_fetch_assoc liegen, bin mir aber nicht sicher.
mysql_fetch_* beginnt mit dem Offset 0 von deinem Result und läuft dieses durch, bis es (gemäß der Schleife) beim letzten angekommen ist. Direkt danach den Result ein weiteres mal zu durchlaufen ist i.a. nicht möglich, da mysql_fetch_* schon bei der letzten Zeile ist.

Wenn du mit mehrfach Ausführen meinst, das selbe Script später noch einmal aufrufen, dann würde ich vorschlagen den Result beim beenden des Scripts zu löschen, mit mysql_free_result().

Die Verwendung von PDO wäre hier nebenbei noch sicherer.
 
Ich danke dir vielmals für deine Hilfe! ;)

Aber die Lösung war mal wieder einfacher als gedacht... Das kommt davon wenn man zu wenig schläft und solange den Fehler suchen will bis man ihn gefunden hat...

Ich habe in der Mitte des Scripts vergessen die Daten zur eindeutigen ID in die DB zu schreiben und daher hat er beim UPDATE alle Datensätze zu meinem Usernamen überschrieben ...
 
Zurück