PDO offre 3 façons différentes de gérer les erreurs afin de mieux s'adapter à l'application.
AntĂ©rieur Ă PHP 8.0.0, c'est le mode par dĂ©faut. PDO dĂ©finit simplement le code d'erreur Ă inspecter grĂące aux mĂ©thodes PDO::errorCode() et PDO::errorInfo() sur les objets reprĂ©sentant les requĂȘtes, mais aussi ceux reprĂ©sentant les bases de donnĂ©es ; si l'erreur rĂ©sulte d'un appel Ă l'objet reprĂ©sentant la requĂȘte, il est possible d'appeler la mĂ©thode PDOStatement::errorCode() ou la mĂ©thode PDOStatement::errorInfo() sur l'objet. Si l'erreur rĂ©sulte d'un appel sur l'objet reprĂ©sentant une base de donnĂ©es, il est Ă©galement possible d'appeler ces deux mĂȘmes mĂ©thodes sur l'objet.
En plus de définir le code d'erreur, PDO émettra un message E_WARNING traditionnel. Cette configuration est utile lors des tests et du débogage, pour voir le problÚme sans interrompre l'application.
à partir de PHP 8.0.0, c'est le mode par défaut. En plus de définir le code d'erreur, PDO lancera une exception PDOException et y définira les propriétés afin de représenter le code d'erreur et les informations complémentaires. Cette configuration est également utile lors du débogage, car elle va « contourner » le point critique du code, montrer rapidement le problÚme rencontré (il faut se rappeler : les transactions sont automatiquement annulées si l'exception fait que le script se termine).
Le mode "exception" est également trÚs utile car ainsi, il est possible de structurer le gestionnaire d'erreur plus clairement qu'avec les alertes traditionnelles PHP et, ce, avec moins de code que lorsque l'on exécute le code en mode silence, et que l'on vérifie systématiquement les valeurs retournées aprÚs chaque appel à la base de données.
Voir le chapitre sur les exceptions pour plus d'informations sur les exceptions en PHP.
PDO utilise les codes erreurs SQL-92 SQLSTATE ; chaque pilote PDO est responsable de lier ses codes natifs aux codes SQLSTATE appropriés. La méthode PDO::errorCode() retourne un code SQLSTATE unique. En cas de besoin d'informations spécifiques sur l'erreur, PDO propose également la méthode PDO::errorInfo() qui retourne un tableau contenant le code SQLSTATE, le code d'erreur spécifique du pilote et la chaßne décrivant l'erreur provenant du pilote.
Exemple #1 Création d'une instance PDO et définition du mode d'erreur
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Cela provoquera une PDOException (lorsque la table n'existe pas).
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>L'exemple ci-dessus va afficher :
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10
Stack trace:
#0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...')
#1 {main}
thrown in /tmp/pdo_test.php on line 10
Note:
PDO::__construct() lance toujours une exception PDOException si la connexion échoue, quelle que soit la configuration de
PDO::ATTR_ERRMODE.
Exemple #2 Crée une instance PDO et définit le mode d'erreur depuis le constructeur
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
// Ceci fera que PDO lancera une erreur de niveau E_WARNING au lieu d'une exception (lorsque la table n'existe pas)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
?>L'exemple ci-dessus va afficher :
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 9