Jedes Mal, wenn Sie die...
"Warning: mysqli_fetch_object() erwartet, dass Parameter 1 mysqli_result, boolean given ist"
...liegt es wahrscheinlich daran, dass es ein Problem mit Ihrer Anfrage gibt. Die prepare()
o query()
könnte zurückkehren FALSE
(ein Boolescher Wert), aber diese allgemeine Fehlermeldung gibt nicht viele Anhaltspunkte. Wie können Sie herausfinden, was mit Ihrer Abfrage nicht stimmt? Sie fragen Sie !
Vergewissern Sie sich zunächst, dass die Fehlerberichterstattung eingeschaltet und sichtbar ist: Fügen Sie diese beiden Zeilen am Anfang Ihrer Datei(en) direkt nach dem Öffnen ein <?php
Tag:
error_reporting(E_ALL);
ini_set('display_errors', 1);
Wenn die Fehlerberichterstattung in der php.ini eingestellt wurde, müssen Sie sich darüber keine Gedanken machen. Achten Sie nur darauf, dass Sie Fehler anständig behandeln und Ihren Nutzern niemals die wahre Ursache von Problemen offenbaren. Die Offenlegung der wahren Ursache kann eine Einladung für diejenigen sein, die Ihren Websites und Servern schaden wollen. Wenn Sie keine Fehler an den Browser senden wollen, können Sie jederzeit die Fehlerprotokolle Ihres Webservers überwachen. Die Speicherorte der Protokolle variieren von Server zu Server, z. B. befindet sich das Fehlerprotokoll unter Ubuntu normalerweise unter /var/log/apache2/error.log
. Wenn Sie die Fehlerprotokolle in einer Linux-Umgebung untersuchen, können Sie tail -f /path/to/log
in einem Konsolenfenster, um Fehler zu sehen, wenn sie in Echtzeit auftreten (....) oder wenn Sie sie machen.
Sobald Sie die Standard-Fehlerberichterstattung im Griff haben, können Sie durch Hinzufügen einer Fehlerprüfung für Ihre Datenbankverbindung und Ihre Abfragen viel mehr Details über die Probleme erfahren. Schauen Sie sich dieses Beispiel an, bei dem der Spaltenname falsch ist. Zunächst der Code, der die allgemeine fatale Fehlermeldung zurückgibt:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
Die Fehlermeldung ist allgemein gehalten und nicht sehr hilfreich bei der Lösung des Problems.
Mit ein paar weiteren Codezeilen können Sie sehr detaillierte Informationen erhalten, die Sie zur Lösung des Problems verwenden können sofort . Prüfen Sie die prepare()
Erklärung auf ihren Wahrheitsgehalt und wenn sie gut ist, können Sie mit dem Binden und Ausführen fortfahren.
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
// handle error
}
Wenn etwas nicht stimmt, können Sie eine Fehlermeldung ausspucken, die Sie direkt zum Problem führt. In diesem Fall gibt es keine foo
Spalte in der Tabelle, ist die Lösung des Problems trivial.
Wenn Sie möchten, können Sie diese Prüfung in eine Funktion oder Klasse einbinden und sie um die bereits erwähnte elegante Fehlerbehandlung erweitern.
15 Stimmen
Sie können weitere nützliche eroor msg erhalten, indem Sie:: QUERY oder die(mysql_error());
124 Stimmen
Auch der obligatorische Hinweis: Ihr Code ist anfällig für SQL-Einschleusung . Sie sollten die Benutzereingaben validieren und/oder ausblenden. Werfen Sie einen Blick auf
mysql_real_escape_string
. Vertrauen Sie niemals auf Benutzerdaten.7 Stimmen
Eigentlich wird der Code des OPs einen Syntaxfehler auf dem MySQL-Server verursachen, aber zumindest ist er pas anfällig für SQL Injection, da bei einfachen Anführungszeichen keine Variableninterpolation möglich ist.
4 Stimmen
@FelixKling Mir ist klar, dass dieser Artikel schon sehr alt ist und zum damaligen Zeitpunkt wahrscheinlich am genauesten war, aber Ihr Kommentar ist jetzt in einer Hinsicht gefährlich falsch:
mysql_real_escape_string
ist nicht das A und O des SQL-Injection-Schutzes; er ist immer noch anfällig für eine Reihe von Angriffen. (Nein, Sie haben nie gesagt, dass es perfekt ist, aber Sie haben angedeutet, dass es die einzige erforderliche Lösung ist) Die beste Lösung ist jetzt PDO, soweit ich weiß.0 Stimmen
@NicHartley Um Ihren Kommentar zu ergänzen: aquí sind Beschreibungen, wie das funktionieren würde.
2 Stimmen
Oh, Gott. Diese Frage auf MySQLi und PDO auszudehnen war eine schlechte Idee. Sie haben jeweils ihre eigene, leicht unterschiedliche Syntax und Fehlermeldungen und hätten durchaus eine eigene Frage verdient. Alles in einer riesigen dreiteiligen Frage zusammenzufassen, macht diese Frage nur weniger googelbar und zwingt Leute, die hierher kommen, sich durch irrelevante Inhalte zu wühlen, um zu dem zu kommen, was sie wollen. Außerdem werden dadurch viele der unten stehenden Antworten ungültig, und die Frage ist nach unseren üblichen Maßstäben "zu breit". Meiner Meinung nach ist es ein Chaos, aber es ist zu spät, um es jetzt zu ändern.
1 Stimmen
Neben dem ersten Fehler hätte das, was Sie gepostet haben, einen weiteren Fehler ausgelöst, und zwar für
LIKE $username
da wir es hier höchstwahrscheinlich mit einer Zeichenkette und nicht mit einer ganzen Zahl zu tun haben. Daher würde es erfordern, dass es in Anführungszeichen gesetzt wird.1 Stimmen
Für alle, die hierher kommen und MySQLi verwenden: Bitte lesen Sie stattdessen diesen Beitrag: Wie kann ich die Fehlermeldung in MySQLi erhalten?