SQL Select liefert immer true zurück, warum?
Nach langem wieder einmal hab ich eben eine kopfzerbrechliche Auseinandersetzung mit meinen Kollegen PHP und MySQL erlebt.
Für die Homepage www.clipcrawl.com musste ein Tagcloud her. Anstatt ein fix fertiges Script zu benutzen, dachte ich mir “Schreib doch selber schnell (
) ein Tagcloud-Script”. Also fing ich auch damit an. Und man kommt hier um eine Datenbanklösung nicht herum. Ich benutzte MySQL und irgendwo musste ich Selects mit der Funktion mysql_query() ausführen.
Das Ergebnis, welches ich vom SQL-Select erhalte beinhaltet einen Boolean-Wert der mir mit dem Rückgabewert True sagt, dass der Befehl erfolgreich war und mit False nicht.
Also führte folgenden Select aus “SELECT tag, count FROM tag_tabelle WHERE tag = ‘Games’ “.
Die Tabelle tag_tabelle erhält die Tags, von denen welche im Tagcloud ausgegeben werden. Die Spalte tag hat den Typ Varchar(150). Ein Datensatz mit dem Wert ‘Games’ in der Spalte tag existierte aber nicht. Warum denn nicht? Die Tabelle war leer und wurde frisch erstellt. OK. Dieser Select würde mir (rein theoretisch) einen Booleanwert mit False als Wert zurückliefern, da ja der gesuchte Datensatz in der Tabelle nicht existiert.
Aber nein nein! Programmieren würde sich mein Hobby & Beruf nicht nennen, wenn etwas nicht läuft wie erwartet. Auch hier lief es nicht wie erwartet. Als Rückgabewert erhielt ich True !!! “Hää?” Dachte ich. “Unmöglich! Geht doch nicht!”. Warum soll der Select erfolgreich gewesen sein?
Mit mysql_fetch_row() versuchte ich (weil es ja anscheinend ein Resultat gab) einen Datensatz zu packen. Dieser war aber leer. *???*
Ich dachte ich werde verrückt. Da ist doch nichts drin in dieser Tabelle und immer erhielt ich beim Select einen Erfolg gemolden.
Ach ja, PHPmyAdmin habe ich nicht benutzt, da ich darauf keinen Zugriff hatte. Nur FTP-Zugriff hatte ich. Ich arbeitete nur mit PHP-Scripts.
Nach langen Blockaden in meinem Hirn entschied ich mich das ganze schnell auf meinem XAMPP-Server lokal nachzuspielen. Gut. Server gestartet und per phpMyAdmin einen Datensatz anhand der VARCHAR-Spalte tag gesucht (natürlich mit SQL Befehl). Das Resultat war wirklich nicht rot im Hintergrund. Kein Fehler wurde gemolden. Aber eine Meldung stand da “MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen).” -.-
Also: Wenn man SQL-Befehle mit z.B. mysql_query ausführt und dabei bei Select-Abfragen im WHERE-Zusatz eine VARCHAR/CHAR-Spalte prüft, dann sich bitte nicht auf den boolean-Rückgabewert verlassen. Gibt es Fehler, so werden diese auch entsprechend mit False gemeldet.
Oder in Kurzfassung: Leere Ergebnisse können auch True sein.
Obwohl ich wirklich am verzweifeln war, fand ich es wieder eine tolle Erfahrung und man sieht hier, dass der Computer nur Befehle ausführt und nicht dumm sein kann.







am 18. Okt. 2007
Moin,
ich denke das Problem ist einfach das auch ein leeres Ergebnis ein Ergebnis im Sinne von mysql_query ist, Dies liefert nämlich ein result zurück und wenn dein result leer ist existiert trotzdem ein result. So geht eine Überprüfung auf False natürlich nicht.du könntest z.b, jetzt nur als erste Idee, mit mysql_affecte_rows() testen ob diese gleich null (0) sind und dann ne exception werfen…gruß
am 18. Okt. 2007
Hi prt36
Jap! Genau so in der Art habe ich es am Schluss auch gelöst. Einfach mit mysql_fetch_row(). Aber danke
Tipps sind immer gut!