PHP Rapport d'erreur


Exemple

Par défaut, PHP affichera des erreurs , des avertissements et des messages de notification directement sur la page si quelque chose d'inattendu dans un script se produit. Ceci est utile pour résoudre des problèmes spécifiques avec un script mais en même temps, il génère des informations que vous ne souhaitez pas que vos utilisateurs connaissent.

Par conséquent, il est recommandé d'éviter d'afficher ces messages qui révèlent des informations sur votre serveur, comme votre arborescence de répertoires, par exemple, dans des environnements de production. Dans un environnement de développement ou de test, ces messages peuvent toujours être utiles à des fins de débogage.

Une solution rapide

Vous pouvez les désactiver pour que les messages ne s'affichent pas du tout, mais cela rend le débogage de votre script plus difficile.

<?php
  ini_set("display_errors", "0");
?>

Ou changez-les directement dans le fichier php.ini .

display_errors = 0

Manipulation des erreurs

Une meilleure option serait de stocker ces messages d'erreur à un endroit où ils sont plus utiles, comme une base de données:

set_error_handler(function($errno , $errstr, $errfile, $errline){
  try{
    $pdo = new PDO("mysql:host=hostname;dbname=databasename", 'dbuser', 'dbpwd', [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);

    if($stmt = $pdo->prepare("INSERT INTO `errors` (no,msg,file,line) VALUES (?,?,?,?)")){
      if(!$stmt->execute([$errno, $errstr, $errfile, $errline])){
        throw new Exception('Unable to execute query');
      }
    } else {
      throw new Exception('Unable to prepare query');
    }
  } catch (Exception $e){
    error_log('Exception: ' . $e->getMessage() . PHP_EOL . "$errfile:$errline:$errno | $errstr");
  }
});

Cette méthode enregistre les messages dans la base de données et si cela échoue dans un fichier au lieu de le renvoyer directement dans la page. De cette façon, vous pouvez suivre les utilisateurs sur votre site Web et vous informer immédiatement si quelque chose ne va pas.