Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Best Practice für die Fehlerbehandlung mit PDO

Das ist eine sehr gute Frage, aber es gibt gleich zu Beginn eine falsche Prämisse:Sie nehmen die Fehlerberichterstattung für PDO getrennt von der standortweiten Fehlerberichterstattung. Was sehr wenig Sinn macht:PDO-Fehler sind in jeder Hinsicht mit anderen Fehlern identisch - Dateisystemfehler, HTTP-Fehler und so weiter. Daher gibt es keinen Grund, nur PDO-Fehlerberichte einzurichten. Sie müssen lediglich die Website-weite Fehlerberichterstattung richtig einstellen.

Es gibt auch eine falsche Annahme bezüglich der Unzugänglichkeit von php.ini:Sie können immer jede Konfigurationsdirektive mit der Funktion ini_set() setzen. Daher gibt es hier keinen einzigen Grund, error_reporting auf das katastrophale Niveau von 0 zu setzen.

Um den Rest Ihrer Fragen zu beantworten, brauchen Sie nur ein wenig gesunden Menschenverstand.

Was denkst du selbst? Ist es sinnvoll, dem Benutzer Systemfehlermeldungen anzuzeigen? Ist es sinnvoll, einem böswilligen Benutzer Systeminterna zu zeigen?

Haben Sie dagegen Einwände?

Glauben Sie nicht, dass es eine ziemlich widersprüchliche Idee ist - Datenbankfehler in die Datenbank zu protokollieren?

Du hast es ja schon gezeigt:display in dev und log in prod. Alles wird standortweit durch wenige einfache Konfigurationsoptionen gesteuert.

KEINE Try-Catch-Blockierung für die Fehlerberichterstattung zu verwenden. Sie werden keinen Catch-Block mit einer freundlichen Fehlermeldung für jede Abfrage in Ihrer App schreiben , wie in der anderen Antwort vorgeschlagen, oder?

Daher muss Ihr Code

sein
<?php
  // Error handling
  error_reporting(-1);
  ini_set('display_errors',0);
  ini_set('log_errors',1);

  // Get credentials from outside document root
  require_once('../settings.php');

  // Tests connection to database
    $dbh = new PDO(
            sprintf(
              'mysql:host=%s;dbname=%s;port=%s;charset=%s',
              $settings['host'],
              $settings['name'],
              $settings['port'],
              $settings['charset']
            ),
            $settings['username'],
            $settings['password']
    );
    // Prevents emulated prepares and activates error handling
    // PDO::ERRMODE_EXCEPTION
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Nun zu der Frage, die Sie im Kommentar geäußert haben.

Ein benutzerdefinierter Fehlerbildschirm ist eine ganz andere Sache und Ihr Code ist damit besonders schlecht. Es darf weder ein 404-Error noch ein HTTP-Redirect verwendet werden (das ist sehr schlecht für SEO).

Um eine benutzerdefinierte Fehlerseite zu erstellen, müssen Sie entweder Ihre Webserverfunktionen (bevorzugt) oder einen Fehlerbehandler in PHP-Skript verwenden.

Wenn ein schwerwiegender Fehler auftritt (und eine nicht abgefangene Ausnahme ist einer), antwortet PHP nicht mit dem HTTP-Status 200 OK, sondern mit dem Status 5xx. Und jeder Webserver kann diesen Status abfangen und eine entsprechende Fehlerseite anzeigen. Z.B. für Apache wäre es

ErrorDocument 503 server_error.html

wo Sie beliebige Ausreden schreiben können.

Oder Sie können einen benutzerdefinierten Fehlerhandler in PHP einrichten, der auch alle PHP-Fehler behandelt. Ein Beispiel finden Sie in dem Artikel, den ich zu diesem Thema geschrieben habe:Die (un)richtige Verwendung von try..catch.