mysqli_fetch_assoc () erwartet Parameter / Aufruf einer Mitgliedsfunktion bind_param () Fehler. Wie bekomme ich den eigentlichen MySQL-Fehler und behebe ihn?

109

In meiner lokalen / Entwicklungsumgebung wird die MySQLi-Abfrage ordnungsgemäß ausgeführt. Wenn ich es jedoch auf meine Webhost-Umgebung hochlade, wird folgende Fehlermeldung angezeigt:

Schwerwiegender Fehler: Aufruf einer Mitgliedsfunktion bind_param () für ein Nichtobjekt 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 das Control Panel phpMyAdmin auszuführen. Das Ergebnis ist in Ordnung.

Siopaoman
quelle
Können wir sehen, wo Sie die $mysqliVariable initiieren ?
Rikesh
Möglicherweise fehlen Ihrem MySQL-Benutzer die Berechtigungen zum Ausführen einer SELECTAbfrage. Hast du das überprüft?
Amal Murali
Was Ihnen in den Sinn kommt, ist, dass kein MySQL verfügbar ist oder Sie falsche Anmeldeinformationen für die Verbindung mit MySQL angegeben haben.
NB
@YourCommonSense - Mit dem alten Titel war es einfacher, diese Frage als doppelte Referenz zu finden.
Paul Spiegel
@ Paul ja, das ist auch meine tiefste Sorge. Ich habe den Titel aus Gründen der Google-Suche und der allgemeinen Erkennung geändert, da für den durchschnittlichen PHP-Benutzer die Verbindung zwischen seinem Code und verschiedenen Umgebungen unklar ist. Aber seitdem fällt es mir auch schwer, es zu finden. Am Ende haben Sie es in Lesezeichen. Wenn Sie einen erkennbaren, aber relevanten Titel vorschlagen können, wäre das großartig
Ihr gesunder Menschenverstand

Antworten:

123

Manchmal ist Ihr MySQLi Code erzeugt einen Fehler , wie mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...oder ähnliches. Oder auch 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, wird in MySQL eine Fehlermeldung angezeigt, in der der Grund erläutert wird . Leider werden solche Fehler standardmäßig nicht an PHP übertragen, und Sie haben lediglich eine oben erwähnte kryptische Fehlermeldung. Daher ist es sehr wichtig, PHP und MySQLi so zu konfigurieren, dass MySQL-Fehler an Sie gemeldet werden. Und sobald Sie die Fehlermeldung erhalten, ist das Beheben ein Kinderspiel.

Wie erhalte ich die Fehlermeldung in MySQLi?

Stellen Sie zunächst immer diese Zeile ein, bevor MySQLi in all Ihren Umgebungen eine Verbindung herstellt:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Danach werden alle MySQL-Fehler in PHP-Ausnahmen übertragen. Eine nicht erfasste Ausnahme führt wiederum zu einem schwerwiegenden PHP-Fehler. Im Falle eines MySQL-Fehlers erhalten Sie daher einen herkömmlichen PHP-Fehler. Dadurch werden Sie sofort auf die Fehlerursache aufmerksam. Ein Stack-Trace führt Sie genau zu der Stelle, an der der Fehler aufgetreten ist.

So konfigurieren Sie PHP in verschiedenen Umgebungen

Hier ist ein Kern meines Artikels über die Meldung von PHP-Fehlern : Die
Meldung von Fehlern auf Entwicklungs- und Live-Servern muss unterschiedlich sein. Auf einem Entwicklungsserver ist es praktisch, Fehler auf dem Bildschirm anzuzeigen. Auf einem Live-Server müssen jedoch stattdessen Fehlermeldungen protokolliert werden, damit Sie sie später im Fehlerprotokoll finden können.

Daher müssen Sie die entsprechenden Konfigurationsoptionen auf die folgenden Werte einstellen:

  • Auf einem Entwicklungsserver

    • error_reportingsollte auf E_ALLWert gesetzt werden;
    • 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_reportingsollte auf E_ALLWert gesetzt werden;
    • log_errors sollte auf 1 gesetzt werden
    • display_errors sollte auf 0 gesetzt werden

Wie benutzt man es tatsächlich?

Entfernen Sie einfach jeder Code, der prüft , ob der Fehler manuell , alle jene or die(), if ($result)und so weiter . Schreiben Sie einfach sofort Ihren Datenbank-Interaktionscode:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

wieder 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 den Benutzer einen Fehlerbehandler verwenden können (dies ist jedoch 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?

Zunächst müssen Sie die Problemabfrage suchen. 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 der Stapelverfolgung folgen , um die Problemabfrage zu finden.

Nachdem Sie die Fehlermeldung erhalten haben, müssen Sie sie lesen und verstehen. Es klingt zu offensichtlich, wenn nicht herablassend, aber die Lernenden übersehen oft die Tatsache, dass die Fehlermeldung nicht nur ein Alarmsignal ist, sondern tatsächlich eine detaillierte Erklärung des Problems enthält . Sie müssen lediglich die Fehlermeldung lesen und das Problem beheben.

  • Wenn eine bestimmte Tabelle nicht vorhanden ist, müssen Sie Rechtschreibung, Tippfehler und Groß- und Kleinschreibung überprüfen. Außerdem müssen Sie sicherstellen, dass Ihr PHP-Skript eine Verbindung zu einer korrekten Datenbank herstellt
  • Wenn die SQL-Syntax fehlerhaft ist, müssen Sie SQL überprüfen. Der Problempunkt befindet sich direkt vor dem in der Fehlermeldung angegebenen Abfrageteil.

Wenn Sie die Fehlermeldung nicht verstehen, versuchen Sie es mit Google. Halten Sie sich beim Durchsuchen der Ergebnisse an Antworten, die den Fehler erklären , anstatt die Lösung unverblümt anzugeben. Eine Lösung funktioniert in Ihrem speziellen Fall möglicherweise nicht, aber die Erklärung hilft Ihnen, das Problem zu verstehen und das Problem selbst zu beheben.

Sie müssen auch der Fehlermeldung vertrauen . Wenn es heißt, dass die Anzahl der Token nicht mit der Anzahl der gebundenen Variablen übereinstimmt, ist dies der Fall . Gleiches gilt für die fehlenden Tabellen oder Spalten. Wenn Sie die Wahl haben, ob es sich um Ihren eigenen Fehler handelt oder die Fehlermeldung falsch ist, bleiben Sie immer bei der ersteren. Wieder 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
  • Verwenden Sie keine die()oder echooder eine andere Funktion bedingungslos die Fehlermeldung auf dem Bildschirm zu drucken. PHP kann Fehler selbst melden und dies abhängig von der Umgebung richtig machen. Lassen Sie es also einfach für PHP.
  • Fügen Sie keine Bedingung hinzu, um das Abfrageergebnis manuell zu testen (wie if($result)). Wenn Fehlerausnahmen aktiviert sind, ist eine solche Bedingung einfach unbrauchbar.
  • Verwenden Sie den try..catchOperator nicht zum Echo der Fehlermeldung. Dieser Operator sollte verwendet werden, um eine Fehlerbehandlung durchzuführen, z. B. ein Transaktions-Rollback. Verwenden Sie es jedoch niemals nur, um Fehler zu melden - wie wir oben erfahren haben, kann PHP dies bereits auf die richtige Weise tun.

PS
Manchmal gibt es keinen Fehler, aber auch keine Ergebnisse. Dann bedeutet dies, dass die Datenbank keine Daten enthält, die Ihren Kriterien entsprechen . In diesem Fall müssen Sie diese Tatsache zugeben, auch wenn Sie schwören können, dass die Daten und die Kriterien in Ordnung sind. Sie sind nicht. Sie müssen sie erneut überprüfen. Ich habe einen Artikel, der in dieser Angelegenheit helfen kann: So debuggen Sie Datenbankinteraktionen . Es ist zwar für PDO geschrieben, aber das Prinzip ist das gleiche. Befolgen Sie einfach diese Anweisungen Schritt für Schritt und lassen Sie entweder Ihr Problem lösen oder haben Sie eine beantwortbare Frage zum Stapelüberlauf.

Ihr gesunder Menschenverstand
quelle
@AdamWinter mit @ ist immer falsch und in diesem speziellen Fall zehnfach. Fehlermeldungen an Ihr Programm sind gleichbedeutend mit Schmerzen für Ihren Körper. Es sagt Ihnen, dass etwas nicht stimmt, als wäre Ihr Bein gebrochen. Und Sie müssen das Bein reparieren, nicht nur ein Schmerzmittel nehmen und weitermachen. HIER GILT DAS GLEICHE. PHP sagt Ihnen, dass es keine Variable gibt, die Sie erwarten. Sie müssen also das Formular oder was auch immer korrigieren, um diese Variable verfügbar zu machen. Schreiben Sie nicht nur einen Code, um einen Fehler zu umgehen.
Ihr gesunder Menschenverstand