Mysql
 sql >> Database >  >> RDS >> Mysql

Best practice per la gestione degli errori mediante PDO

Questa è un'ottima domanda, ma all'inizio c'è una premessa sbagliata:stai prendendo la segnalazione degli errori per PDO separata dalla segnalazione degli errori a livello di sito. Il che non ha molto senso:gli errori PDO in ogni modo sono gli stessi degli altri errori:errori del filesystem, errori HTTP e così via. Pertanto, non vi è alcun motivo per stabilire la segnalazione degli errori solo PDO. Tutto ciò che serve è impostare correttamente la segnalazione degli errori a livello di sito.

C'è anche un presupposto sbagliato riguardo all'inaccessibilità di php.ini:puoi sempre impostare qualsiasi direttiva di configurazione usando la funzione ini_set(). Quindi, qui non c'è un solo motivo per impostare error_reporting al livello disastroso di 0.

Per rispondere al resto delle tue domande ti serve solo un po' di buon senso.

Cosa pensi tu stesso? È utile mostrare all'utente messaggi di errore di sistema? È utile mostrare i componenti interni del sistema a un utente malintenzionato?

Hai delle obiezioni in merito?

Non pensi che sia un'idea abbastanza contraddittoria:registrare gli errori del database nel database?

L'hai già mostrato:visualizza in dev e accedi prod. Tutto è controllato a livello di sito attraverso poche semplici opzioni di configurazione.

NON utilizzare il blocco try-catch per la segnalazione degli errori. Non scriverai un blocco catch con un messaggio di errore amichevole per ogni query nella tua app , come suggerito nell'altra risposta, vero?

Quindi il tuo codice deve essere

<?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);

Ora alla domanda che hai espresso nel commento.

Una schermata di errore personalizzata è una questione molto diversa e il tuo codice è particolarmente pessimo. Né dovrebbe essere un errore 404 né un reindirizzamento HTTP devono essere utilizzati (questo è molto negativo per SEO).

Per creare una pagina di errore personalizzata devi utilizzare le funzionalità del tuo server web (preferito) o un gestore di errori nello script PHP.

Quando si verifica un errore fatale (e un'eccezione non rilevata è una), PHP non risponde con lo stato HTTP 200 OK ma con lo stato 5xx. E ogni server web può catturare questo stato e mostrare una pagina di errore corrispondente. Per esempio. per Apache sarebbe

ErrorDocument 503 server_error.html

dove puoi scrivere tutte le scuse che vuoi.

Oppure puoi impostare un gestore di errori personalizzato in PHP che gestisca anche tutti gli errori PHP, un esempio può essere visto nell'articolo che ho scritto sull'argomento:L'uso (im)corretto di try..catch.