mysql_fetch_array dreht durch...und ich gleich mit
Matthias
- php
hi!
ich lasse wie folgt daten auslesen:
while ( $data = mysql_fetch_array ( $res ) or die( "Error while running db-query in loop $loopcount." ) )
{
$staedte[id] = $data[id];
echo "$staedte[id] - ";
$staedte[tabelle] = $data[tabelle];
echo "$staedte[tabelle]<br>";
$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).
ich bin mit meiner weisheit am ende. blickt jemand durch?
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?
vielen dank schon im voraus,
matthias
Servus,
nur eine Vermutung,
while ( $data = mysql_fetch_array ( $res ) or die( "Error while
aber ich glaube des Fetch Arry gibt dir noch einen Wert mehr mit als gewollte.
Gruss Matze
while ( $data = mysql_fetch_array ( $res ) or die( "Error while
aber ich glaube des Fetch Arry gibt dir noch einen Wert mehr mit als gewollte.
diese vermutung liegt in der tat nahe. ich frage mich allerdings woher? es sind nur 21 datensätze in der tabelle vorhanden.
Lass Dir doch mal die Ergebnisse Ausgeben z.B. mit echo.
Was bekommst Du??
Gruss Matze
Servus,
nachem die Doku eigentlich sagt, dass Dein Code so gut aussieht....
while ( $data = mysql_fetch_array ( $res ) or die( "Error while running db-query in loop $loopcount." ) )
Ich glaube das or die innerhalb einer Scheifen Anweisung bereitet Probleme. Kann es sein, dass er die or die anweisung als 22 Satz wertet?? Schlies das mal aus.
Gruss Matze
Ich glaube das or die innerhalb einer Scheifen Anweisung bereitet Probleme.
das scheint's zu sein. hab's rausgenommen und es läuft. wie kann ich denn alternativ eine kontrolle für den fetch_array befehl einbauen?
Servus,
da muss ich leider passen dafür reicht meine PHP Wissen nicht aus.
Gruss Matze
Versuche es doch so....
while ( mysql_fetch_array ( $res ) )
{
$data = mysql_fetch_array ( $res ) or die( "Error while running db-query in loop $loopcount." )
}
Allerding würde hierbei jeder 2. Datensatz verwinden schätze ich mal.
Du müsstest es über eine for Schleie machen und anhand des Zählers $loopcount auf den jeweiligen Datensatz zugreifen.
Gruss Matze
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