/ / So erhalten Sie MySQLi-Fehlerinformationen in verschiedenen Umgebungen - PHP, Mysqli, Prepare-Statement, Umgebung, Fehlerberichterstattung

Wie bekomme ich MySQLi Fehlerinformationen in verschiedenen Umgebungen - PHP, MySQL, Prepared-Anweisung, Umgebung, Fehler-Reporting

In meiner lokalen / Entwicklungsumgebung führt die MySQLi-Abfrage OK aus. Wenn ich es in meine Webhostumgebung hochlade, erhalte ich folgende Fehlermeldung

Schwerwiegender Fehler: Aufruf einer Memberfunktion 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 Bedienfeld phpMyAdmin auszuführen. Das Ergebnis ist in Ordnung.

Antworten:

63 für die Antwort № 1

Zuallererst haben Sie immer diese Leitung, bevor MySQLi eine Verbindung herstellt alle Ihre Umgebungen:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

Beachten Sie, dass Sie sehen können müssen PHP-Fehler im Allgemeinen. Und hier geht es in der Tat um verschiedene Umgebungen:

  • Auf einer Live-Site müssen Sie einen Blick in die Fehlerprotokolle werfen

    error_reporting(E_ALL);
    ini_set("display_errors", 0);
    ini_set("log_errors", 1);
    
  • Auf einem lokalen Entwicklungsserver ist es in Ordnung, Fehler auf dem Bildschirm zu machen:

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

Und eine kleine Liste von dir sollte nicht:

  • Verwenden Sie den Fehlerunterdrückungsoperator (@)
  • Benutzen die() oder echo oder eine beliebige andere Funktion, um die Fehlermeldung bedingungslos auf dem Bildschirm zu drucken. PHP kann dies bereits gut ausdrücken, es ist keine Unterstützung erforderlich.
  • Testen Sie das Abfrageergebnis manuell (z. B. if($result)) macht einfach keinen Sinn. Entweder ist Ihre Abfrage fehlgeschlagen und Sie erhalten bereits die Fehlerausnahme, oder es war in Ordnung und es gibt nichts zu testen.
  • Verwenden Sie try..catch, um die Fehlermeldung zu wiederholen. Wieder kann PHP es besser machen, viel besser.