Il est très fortement conseillé de désactiver l'affichage des erreurs PHP
(directive display_errors
du php.ini
) de vos applications web pour ne pas
révéler des informations pouvant compromettre la sécurité de votre serveur (dans
le cas d'un serveur en production).
Seulement voilà, cacher ces erreurs peut gêner l'administrateur à traquer les bugs ainsi que les problèmes liés à la base de données. En effet, c'est beaucoup plus facile de repérer une erreur si elle est affichée lors de l'exécution de la page plutôt que de passer son temps à analyser les logs du service.
Concernant les erreurs liées à la base de données, j'utilise une astuce maison
dans le cadre d'une application avec authentification. En effet, j'affiche les
erreurs SQL seulement si l'utilisateur connecté est administrateur. À supposer
que la variable $_SESSION['status']
contient le niveau de permissions de
l'utilisateur connecté, voici un exemple pour la connexion et l'exploitation
d'une base de données en PHP (avec PDO) :
<?php
// Connection variables.
$db_type = "";
$db_host = "";
$db_user = "";
$db_password = "";
$db_database = "";
// We test the connection with the database.
try
{
$db = new PDO($db_type.":host=".$db_host.";dbname=".$db_database, $db_user, $db_password);
}
catch (Exception $e)
{
// If the current user has the administrator status, we display the
// complete error message.
if (isset($_SESSION['status']) && $_SESSION['status'] == 'admin')
die("Error : " . $e->getMessage());
// Else, we display a generic error message with no details.
else
die("Error : Impossible to establish the connection with the database.");
}
// Used to handle database error messages.
function mySqlError($db)
{
// If the current user has the administrator status, we display the
// complete error message.
if (isset($_SESSION['status']) && $_SESSION['status'] == 'admin')
print_r($db->errorInfo());
// Else, we display a generic error message with no details.
else
echo "Error : Sorry, an SQL error has occured.";
}
?>
Et lors d'une requête SQL :
<?php
$exemple_of_query = $db->prepare("INSERT INTO table VALUES (:var1, :var2, :var3)");
$exemple_of_query->execute(array('var1' => $var1, 'var2' => $var2, 'var3' => $var3))
or die(mySqlError($db));
?>
Il est bien sûr possible d'adapter cette astuce pour d'autres utilisations que le SQL.
L'intérêt est d'apporter un confort supplémentaire à l'administrateur (à supposer qu'il se sert des applications qu'il développe) mais aussi aux utilisateurs finaux avec des messages d'erreur "propres", correspondant à leur profile.