Sven Rautenberg: mysql_fetch_array dreht durch...und ich gleich mit

Beitrag lesen

Moin!

while ( $data = mysql_fetch_array ( $res ) or die( "Error while running db-query in loop $loopcount." ) )
{
...
      $loopcount++;
}

es sind 21 datensätze zum auslesen vorhande, die auch alle brav über die echo-befehle ausgegeben werden.
allerdings macht die schleife aus einem mir unerklärlichen grund noch einen 22. durchlauf, sodaß sich die fehlermeldung "Error while running db-query in loop 22." ergibt und sich das skript an der stelle aufhängt (sämtlicher folgecode wird nicht ausgeführt).

Der Code macht genau, was er machen soll. Und genau das, was du programmiert hast - nur nicht das, was du glaubst, was du programmiert hast.

Das Problem ist die Verknüpfung von "or die()" mit while.

Wenn du nur
while ($data = mysql_fetch_array())
benutzt, dann läuft die While-Schleife solange, wie mysql_fetch_array() insgesamt einen wahren Rückgabewert zurückgibt. Das beruht auf dem Trick, dass bei einer Zuweisung der zugewiesene Wert nicht nur der Variablen übergeben wird, sondern auch als Gesamtergebnis der Zuweisung nach außen gegeben wird, in diesem Fall an "while".

Wenn mysql_fetch_array() keine Daten mehr auslesen kann, gibt die Funktion false zurück.

Und nun kommt die Kombination mit "y = x or die()". Die or-Verknüpfung wird "short circuit" ausgewertet, d.h. wenn der Wahrheitswert von or schon feststeht, wird der Rest nicht mehr ausgewertet. Wenn x (also mysql_fetch_array()) wahr ist, weil es einen Datensatz findet, wird die() nicht mehr ausgeführt. Wenn x false ist, wird die() ausgeführt.

Und nun kommt die Schleife, führt 21 Mal erfolgreich mysql_fetch_array() aus, hat dann keine Datensätze mehr, und die einzige Chance, diese Tatsache (total ordnungsgemäß) festzustellen, liegt darin, dass mysql_fetch_array() eben false zurückgibt. Weil in diesem Fall aber mit "or die()" das Programm gleich ganz abgebrochen wird, wunderst du dich wie blöde. Dabei _muß_ mysql_fetch_array() genau einmal "scheitern", wenn du auf diese Weise die DB-Abfrage ausliest. Klassicherweise wird so eine Schleife ohne "or die()" benutzt: Solange Datensätze da sind, lies einen aus und mach was damit.

Das impliziert, dass man irgendwann feststellt, dass keine Datensätze mehr da sind. :o)

vielleicht kann mir auch jemand sagen ob - und wenn ja wie - ich für dieses problem eine fehlermeldung ausgeben kann. da muß es doch eine möglichkeit geben, oder?

Warum? Das Nicht-Vorhandensein von DB-Einträgen (weil Null EInträge gefunden wurden) ist ja kein Fehler. Allenfalls kann dein Programm das als "nicht so gut" definieren. Dazu fragst du vor der Schleife am sinnvollsten mysql_num_rows() ab, das gibt dir die Anzahl gefundener Datensätze zurück.

Mit dieser Anzahl kannst du dann im Prinzip statt der while-Schleife auch eine for-Schleife benutzen, um die Datensätze auszulesen. while-Schleifen finde ich aber eleganter, weil man bei ihnen den Fall _nicht_ abfangen muß, dass kein Datensatz gefunden wurde. Wenn das so ist, wird die Schleife nämlich einfach übersprungen. Bei for-Schleifen wäre ich mir da nie so ganz sicher (obwohl die Umsetzung in PHP im Prinzip auch nur eine while-Schleife ist).

- Sven Rautenberg

--
SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|