Es kommt immer wieder vor, dass eine Abfrage einfach nicht funktioniert. Das Problem dann zu finden ist gar nicht so leicht, aber nur, wenn man ein paar Tricks nicht kennt.
Oft bekommt man solch eine Fehlermeldung:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /test.php on line 5
Wollen wir uns mal anschauen, wie die Fehlermeldung zustande gekommen ist:
<?php $query ="SELECT name, password FROM table_name"; $result = mysql_query($query); while($row = mysql_fetch_object($result)) { //Mache etwas } ?>
Also irgendwie meckert PHP herrum, dass etwas mit mysql_fetch_object nicht in Ordnung ist.
Und zwar steht in der Fehlermeldung, dass das Argument (die Variable), keine gültige MySQL-Resource ist. Aber was bedeutet das jetzt?
Und zwar gibt mysql_query(); sofern alles funktioniert hat, eine MySQL-Resource zurück, wenn nicht, ein false.
Eine MySQL-Resource ist in etwa der Speicherort wo das Ergebnis hinterlegt ist.
Also bemängelt mysql_fetch_object(); das $result keine gültige Resource ist, also muss $ergebnis false sein. Daraus folgern wir, dass irgendetwas nicht mit der Abfrage stimmt.
Um das herrauszufinden, gibt es die Funktion:mysql_error();. Diese Funktion gibt den letzten MySQL Fehler aus, wir können den Script ja z.B. so anpassen:
<?php $query ="SELECT name, password FROM table_name"; $result = mysql_query($query) OR die("Error: $query <br>".mysql_error()); while($row = mysql_fetch_object($result)) { // your code here } ?>
Also dieses OR die() bewirkt, dass falls mysql_query()fehlerhaft ist, etwas ausgegeben wird.
Und zwar wird zuerst die Abfrage, und danach die Rückgabe von mysql_error() ausgegeben.
Das könnte z.B. so aussehen:
Error: SELECT name, password FROM table_name
Unknown column ‚password‘ in ‚field list‘
Naja diese Fehlermeldung ist ziehmlich eindeutig, und zwar ist das Feld password nicht vorhanden. Vielleicht heißt es ja passwort?
Eine weitere Fehlerquelle ist oft soetwas:
<?php $query ="SELECT text, show FROM news WHERE id = '1'"; $result = mysql_query($query) OR die("Error: $query <br>".mysql_error()); //.... ?>
Dies führt zu einem Fehler, und zwar:
Error: SELECT text FROM news WHERE id = ‚1‘ You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‚FROM news WHERE id = ‚1“ at line 1
Auch wenn die Spalten wirklich vorhanden sind, führt uns dies nicht weiter.
Denn show (oder SHOW) ist ein von MySQL reserviertes Wort/Befehl. Man kann diesen Namen so nicht als Spaltennamen benutzen, genauso wie z.B. delete, update o.ä. hier versagen würde.
Entweder benutzt man also nicht reservierte Wörter, oder man muss den Spaltennamen show in backticks setzen:
<?php $query ="SELECT text, `[/b]show[b]`[/b] FROM news WHERE id = '1'"; //... ?>
Diese backticks (`) sind keine einfachen Anführungszeichen!
Mit diesen Umschließt man z.B. Spaltennamen, Tabellennamen und ähnliches.
Die Abfrage könnte dann auch so aussehen:
<?php $query = "SELECT `text`, `show` FROM `news` WHERE `id` = '1'"; //... ?>
Fehler in INSERT, UPDATE u.ä
Mit
mysql_query($query) OR die(mysql_error());
lassen sich nicht nur Fehler in SELECT Befehlen finden, sondern man kann mit ihnen auch Fehler in INSERT oder UPDATE Befehlen finden.
Wenn also ein Datenwert nicht eingetragen, aktualisiert oder verändert wird, sollte man als erstes immer das
OR die(…)
ergänzen. Denn mysql_error() funktioniert mit jeder SQL Anweisung.