In meiner lokalen/Entwicklungsumgebung funktioniert die MySQLi-Abfrage einwandfrei. Wenn ich es jedoch in meine Webhostumgebung hochlade, erhalte ich diesen Fehler:
Schwerwiegender Fehler: Aufruf einer Member-Funktion bind_param() für ein Nicht-Objekt in …
Hier ist der Code:
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Um meine Abfrage zu überprüfen, habe ich versucht, die Abfrage über die Systemsteuerung auszuführen phpMyAdmin und das ergebnis ist ok.
TL;DR
- Immer haben
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
in Ihrem mysqli-Verbindungscode. Dadurch kann MySQL Ihnen sagen, was das eigentliche Problem ist, sei es mit der Abfrage, dem Server, der Datenbank oder was auch immer.
- Ersetzen Sie in der SQL-Abfrage immer jede PHP-Variable durch ein Fragezeichen und führen Sie die Abfrage mit aus vorbereitete Aussage. Es hilft, Syntaxfehler aller Art zu vermeiden.
Erläuterung
Manchmal erzeugt Ihr MySQLi-Code einen Fehler wie mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given...
, Call to a member function bind_param()...
oder ähnliches. Oder sogar ohne Fehler, aber die Abfrage funktioniert trotzdem nicht. Dies bedeutet, dass Ihre Abfrage nicht ausgeführt werden konnte.
Jedes Mal, wenn eine Abfrage fehlschlägt, hat MySQL dies getan eine Fehlermeldung, die den Grund erklärt. Leider werden solche Fehler standardmäßig nicht an PHP übertragen, und Sie erhalten lediglich die oben erwähnte kryptische Fehlermeldung. Daher ist es sehr wichtig, PHP und MySQLi so zu konfigurieren, dass sie Ihnen MySQL-Fehler melden. Und sobald Sie die Fehlermeldung erhalten, ist die Behebung ein Kinderspiel.
So erhalten Sie die Fehlermeldung in MySQLi
Zuallererst sollten Sie immer diese Zeile haben, bevor sich MySQLi einloggt alle Ihre Umgebung:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Danach werden alle MySQL-Fehler in PHP-Ausnahmen übertragen. Eine nicht abgefangene Ausnahme führt wiederum zu einem schwerwiegenden PHP-Fehler. Im Falle eines MySQL-Fehlers erhalten Sie also einen herkömmlichen PHP-Fehler. Dadurch werden Sie sofort auf die Fehlerursache aufmerksam. Und ein Stack-Trace führt Sie genau an die Stelle, an der der Fehler aufgetreten ist.
Wie man PHP in verschiedenen Umgebungen konfiguriert
Hier ist eine Zusammenfassung meines Artikels über PHP-Fehlerberichterstattung: Das Melden von Fehlern auf Entwicklungs- und Live-Servern muss unterschiedlich sein. Auf einem Entwicklungsserver ist es bequem, Fehler auf dem Bildschirm anzuzeigen, aber auf einem Live-Server müssen stattdessen Fehlermeldungen protokolliert werden, damit Sie sie später im Fehlerprotokoll finden können.
Daher müssen Sie entsprechende Konfigurationsoptionen auf die folgenden Werte setzen:
-
Auf einem Entwicklungsserver
-
error_reporting
sollte eingestellt werden E_ALL
Wert;
-
log_errors
sollte auf 1 gesetzt werden (es ist praktisch, Protokolle auch auf einem Entwicklungs-PC zu haben)
-
display_errors
sollte auf 1 gesetzt werden
-
Auf einem Produktionsserver
-
error_reporting
sollte eingestellt werden E_ALL
Wert;
-
log_errors
sollte auf 1 gesetzt werden
-
display_errors
sollte auf 0 gesetzt werden
Wie man es tatsächlich benutzt
Entfernen Sie einfach jeden Code, der manuell nach dem Fehler suchtalle diese or die()
, if ($result)
und derartige. Schreiben Sie einfach gleich Ihren Datenbank-Interaktionscode:
$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();
Aufs Neue, ohne irgendwelche Bedingungen herum. Wenn ein Fehler auftritt, wird er wie jeder andere Fehler in Ihrem Code behandelt. Auf einem Entwicklungs-PC wird es beispielsweise nur auf dem Bildschirm angezeigt, während es auf einer Live-Site für einen Programmierer protokolliert wird, während Sie für die Bequemlichkeit des Benutzers einen Fehlerbehandler verwenden könnten (aber das ist eine andere Geschichte, die nicht zum Thema gehört MySQLi, aber Sie können darüber in dem oben verlinkten Artikel lesen).
Was tun mit der Fehlermeldung, die Sie erhalten
Zunächst müssen Sie die Problemabfrage lokalisieren. Die Fehlermeldung enthält den Dateinamen und die Zeilennummer der genauen Stelle, an der der Fehler aufgetreten ist. Für den einfachen Code reicht das aus, aber wenn Ihr Code Funktionen oder Klassen verwendet, müssen Sie möglicherweise die folgen Stack-Trace um die Problemabfrage zu finden.
Nachdem Sie die Fehlermeldung erhalten haben, müssen Sie sie lesen und verstehen. Es klingt zu offensichtlich, wenn nicht sogar herablassend, aber Lernende übersehen oft, dass die Fehlermeldung nicht nur ein Alarmsignal ist, sondern tatsächlich eine enthält ausführliche Erklärung des Problems. Und alles, was Sie brauchen, ist, die Fehlermeldung zu lesen und das Problem zu beheben.
- Sagen wir, wenn es heißt, dass eine bestimmte Tabelle nicht existiert, müssen Sie Rechtschreibung, Tippfehler und Groß-/Kleinschreibung überprüfen. Außerdem müssen Sie sicherstellen, dass sich Ihr PHP-Skript mit einer korrekten Datenbank verbindet
- Oder, wenn es sagt, dass es einen Fehler in der SQL-Syntax gibt, dann müssen Sie Ihr SQL untersuchen. Und die Problemstelle ist richtig Vor der in der Fehlermeldung genannte Abfrageteil.
Wenn Sie die Fehlermeldung nicht verstehen, versuchen Sie, sie zu googeln. Und wenn Sie die Ergebnisse durchsuchen, bleiben Sie bei diesen Antworten erklären den Fehler, anstatt unverblümt die Lösung zu geben. Eine Lösung funktioniert in Ihrem speziellen Fall möglicherweise nicht, aber die Erklärung hilft Ihnen, das Problem zu verstehen, und versetzt Sie in die Lage, das Problem selbst zu beheben.
Musst du auch Vertrauen die Fehlermeldung. Wenn es heißt, dass die Anzahl der Token nicht mit der Anzahl der gebundenen Variablen übereinstimmt, dann ist es so ist damit. Gleiches gilt für die fehlenden Tabellen oder Spalten. Vor die Wahl gestellt, ob es Ihr eigener Fehler ist oder die Fehlermeldung falsch ist, bleiben Sie immer bei ersterem. Auch hier klingt es herablassend, aber Hunderte von Fragen auf dieser Website beweisen, dass dieser Rat äußerst nützlich ist.
Eine Liste von Dingen, die Sie in Bezug auf die Fehlerberichterstattung niemals tun sollten
- Verwenden Sie niemals einen Fehlerunterdrückungsoperator (
@
)! Dadurch kann ein Programmierer die Fehlermeldung nicht lesen und den Fehler daher nicht beheben
- Verwende nicht
die()
oder echo
oder eine andere Funktion, um die Fehlermeldung unbedingt auf dem Bildschirm auszugeben. PHP kann Fehler selbst melden und macht es abhängig von der Umgebung richtig – also überlassen Sie es einfach PHP.
- Fügen Sie keine Bedingung hinzu, um das Abfrageergebnis manuell zu testen (wie z
if($result)
). Wenn Fehlerausnahmen aktiviert sind, ist eine solche Bedingung einfach nutzlos.
- Verwenden Sie nicht die
try..catch
Operator für die Ausgabe der Fehlermeldung. Dieser Operator sollte verwendet werden, um Fehler zu behandeln, wie z. B. ein Transaktions-Rollback. Verwenden Sie es jedoch niemals nur, um Fehler zu melden – wie wir oben gelernt haben, kann PHP dies bereits tun, und zwar auf die richtige Weise.
PS
Manchmal gibt es keinen Fehler, aber auch keine Ergebnisse. Dann heißt es, Es gibt keine Daten in der Datenbank, die Ihren Kriterien entsprechen. In diesem Fall müssen Sie diese Tatsache zugeben, auch wenn Sie beschwören können, dass die Daten und Kriterien in Ordnung sind. Sie sind nicht. Sie müssen sie noch einmal überprüfen.
Ich habe einen Artikel, der in dieser Angelegenheit helfen kann, So debuggen Sie Datenbankinteraktionen. Obwohl es für PDO geschrieben ist, ist das Prinzip dasselbe. Befolgen Sie einfach diese Anweisungen Schritt für Schritt und haben Sie entweder Ihr Problem gelöst oder eine beantwortbare Frage für Stack Overflow.
Es könnte sein, dass Ihrem MySQL-Benutzer die Berechtigungen fehlen, um Folgendes zu tun
SELECT
Anfrage. Hast du das überprüft?– Amal Murali
26. März 2014 um 13:30 Uhr