Mysql
 sql >> Base de données >  >> RDS >> Mysql

Meilleure pratique pour la gestion des erreurs à l'aide de PDO

C'est une très bonne question, mais il y a une prémisse erronée au tout début :vous prenez des rapports d'erreurs pour PDO séparés des rapports d'erreurs à l'échelle du site. Ce qui n'a que peu de sens :les erreurs PDO sont en tous points identiques aux autres erreurs - erreurs de système de fichiers, erreurs HTTP, etc. Ainsi, il n'y a aucune raison d'établir un rapport d'erreur PDO uniquement. Tout ce dont vous avez besoin est de configurer correctement le rapport d'erreurs à l'échelle du site.

Il existe également une hypothèse erronée concernant l'inaccessibilité de php.ini :vous pouvez toujours définir n'importe quelle directive de configuration à l'aide de la fonction ini_set(). Ainsi, il n'y a pas une seule raison de définir error_reporting au niveau désastreux de 0.

Pour répondre au reste de vos questions, il vous suffit d'un peu de bon sens.

Qu'est-ce que tu penses toi ? Est-il utile d'afficher les messages d'erreur du système à l'utilisateur ? Est-il utile de montrer les éléments internes du système à un utilisateur malveillant ?

Avez-vous des objections à cela ?

Ne pensez-vous pas que c'est une idée assez contradictoire - consigner les erreurs de base de données dans la base de données ?

Vous l'avez déjà montré :afficher dans dev et se connecter dans prod. Tout est contrôlé à l'échelle du site grâce à quelques options de configuration simples.

NE PAS utiliser le bloc try-catch pour les rapports d'erreurs. Vous n'allez pas écrire un bloc catch avec un message d'erreur convivial pour chaque requête de votre application , comme il est suggéré dans l'autre réponse, êtes-vous ?

Ainsi, votre code doit être

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

Passons maintenant à la question que vous avez exprimée dans le commentaire.

Un écran d'erreur personnalisé est une question très différente et votre code est particulièrement mauvais avec lui. Ni une erreur 404 ni une redirection HTTP ne doivent être utilisées (c'est très mauvais pour le référencement).

Pour créer une page d'erreur personnalisée, vous devez utiliser les fonctionnalités de votre serveur Web (de préférence) ou un gestionnaire d'erreurs dans un script PHP.

Lorsqu'il rencontre une erreur fatale (et que l'exception non interceptée en est une), PHP ne répond pas avec le statut HTTP 200 OK mais avec le statut 5xx. Et chaque serveur Web peut détecter ce statut et afficher une page d'erreur correspondante. Par exemple. pour Apache ce serait

ErrorDocument 503 server_error.html

où vous pouvez écrire toutes les excuses que vous voulez.

Ou vous pouvez configurer un gestionnaire d'erreurs personnalisé en PHP qui gérerait également toutes les erreurs PHP, un exemple peut être vu dans l'article que j'ai écrit à ce sujet :L'utilisation (im)appropriée de try..catch.