it-swarm.com.de

So erhalten Sie MySQLi-Fehlerinformationen in verschiedenen Umgebungen

In meiner lokalen/Entwicklungsumgebung führt die MySQLi-Abfrage OK aus. Wenn ich es jedoch in meine Webhost-Umgebung 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.

66
siopaoman

Zuallererst haben Sie immer diese Zeile, 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 macht einen schwerwiegenden Fehler PHP. 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 PHP -Fehler allgemein anzeigen müssen. Und hier geht es in der Tat um verschiedene Umgebungen:

  • Auf einer Live-Site müssen Sie einen Blick in die Fehlerprotokolle werfen, also müssen Einstellungen vorgenommen werden

    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 dem, was Sie sollten nicht:

  • Verwenden Sie den Fehlerunterdrückungsoperator (@).
  • Verwenden Sie die() oder echo oder eine andere Funktion, um die Fehlermeldung bedingungslos auf dem Bildschirm zu drucken. PHP kann es schon gut wiedergeben, es ist keine Unterstützung erforderlich.
  • Ein manuelles Testen des Abfrageergebnisses (wie 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.
75

Ich glaube nicht, dass Sie das Objekt erstellt haben.

$ mysqli = new mysqli ('localhost', 'my_user', 'my_password', 'world');

aber ich schlage vor, dass Sie stattdessen PDO verwenden.

0
Wayne Oliver