mysqli_fetch_array(): Argument #1 muss vom Typ mysqli_result sein. Wie gehe ich mit mysqli-Problemen um?

Lesezeit: 8 Minuten

mysqli fetch array Argument 1 muss vom Typ mysqli result sein Wie gehe
siopaoman

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.

  • 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

mysqli fetch array Argument 1 muss vom Typ mysqli result sein Wie gehe
Ihr gesunder Menschenverstand

TL;DR

  1. 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.
  2. 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.

  • @AdamWinter mit @ ist immer falsch und in diesem speziellen Fall zehnfach. Fehlermeldungen an Ihr Programm sind dasselbe wie ein Schmerz für Ihren Körper. Es sagt Ihnen, dass etwas nicht stimmt, als wäre Ihr Bein gebrochen. Und man muss das Bein fixieren, nicht einfach 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 reparieren, um diese Variable verfügbar zu machen. Schreiben Sie nicht nur einen Code, um einen Fehler zu umgehen.

    – Ihr gesunder Menschenverstand

    25. Mai 2020 um 22:10 Uhr

  • Zum größten Teil stimme ich zu, aber “Ihr gesunder Menschenverstand”, dem ich nicht zustimme: “Schreiben Sie nicht nur Code, um einen Fehler zu umgehen”. Auf unkontrollierte Weise sind einige Fehler, die Sie nicht im Code beheben können, z. B. der DB-Server, verschwunden. Sie müssen den Fehler nur verwalten und umgehen, um ein gültiges Ergebnis zu erzielen.

    – Barkermn01

    9. September 2020 um 14:44 Uhr

  • @Barkermn01 das ist ein echtes Anliegen von dir, aber du ziehst falsche Schlüsse daraus. Natürlich sollte Ihre Anwendung ein gültiges Ergebnis liefern (das im Falle eines „Mysql has been away“-Fehlers eine generische 500-Fehlerseite sein sollte). Aber man muss verstehen, dass so ein gültiges Ergebnis ist keine Angelegenheit Ihres Datenbankcodes. Ihr datenbankbezogener Code sollte mit einer Datenbank funktionieren. Während das Anzeigen der Fehlerseite ein Anliegen eines anderen Codes sein sollte. Siehe hier: phpdelusions.net/articles/error_reporting

    – Ihr gesunder Menschenverstand

    9. September 2020 um 14:50 Uhr


  • Ich verstehe, dass es nur das Zeug war wie “Aber verwenden Sie es niemals nur, um Fehler zu melden”, es schließt völlig objektive Codebasen aus, z Wo die Modellverwendung umschlossen ist, kann der Fehler behandelt und der Fehler angezeigt werden. In diesem Fall verwende ich eine API, sodass der Fehler und alle Ablaufverfolgungsinformationen an den API-Aufruf gesendet werden, wenn sie von unserem Remote-System stammen (Origin Verification ), da viele Web-Sachen jetzt das PHP-Backend REACT oder das Angular-Frontend dosieren

    – Barkermn01

    10. September 2020 um 1:10 Uhr


  • “Nicht erfasste Ausnahme macht wiederum einen fatalen PHP-Fehler” Ist das Verursachen eines schwerwiegenden Fehlers auf einem PRODUKTIONS-Server eine gute Idee (für MySQL-Fehler)? Gibt es nicht ein paar Situationen, in denen der Fehler auf ein Problem hinweist, mit dem sich Ihr Skript befassen und so fortfahren sollte, wie es kann; z. B. den Benutzer informieren, dass Sie ihm diese Informationen im Moment nicht geben können, während Sie einen Operator auffordern, Nachforschungen anzustellen? BEARBEITEN Wie ich sehe, versuchen Sie bei Bedarf, mysql-Fehler abzufangen (die Sie in PHP-Fehler konvertiert haben).

    – WerkzeugmacherSteve

    10. Juli 2021 um 12:32 Uhr


994740cookie-checkmysqli_fetch_array(): Argument #1 muss vom Typ mysqli_result sein. Wie gehe ich mit mysqli-Problemen um?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy