Gestion des erreurs

Quand une instruction PDO échoue, aucun message n'est affiché. On peut alors croire à tort que tout s'est bien passé. Il est donc important de savoir obtenir des informations sur d'éventuelles erreurs. Pour avoir des informations plus précises que ces quelques lignes, allez voir les pages dont elles sont extraites sur PHP.net.

Pour la suite nous continuerons à nous placer dans le cas où on a auparavant obtenu un identifiant de connexion $dbh (instance de la classe de base de PDO).

Code d'erreur

La méthode $db->errorCode() renvoie le code d'erreur associé avec la dernière opération effectuée sur la base de données. Sa valeur est 0 (zéro) si il n'y a pas eu d'erreur.

Informations associées à l'erreur

La méthode $db->errorInfo() renvoie les informations associées à l'erreur survenue lors de la dernière opération sur la base de données. Il s'agit d'un tableau qui contient les champs décrit Tableau 10.1, « Champs de $db->errorInfo() ».

Tableau 10.1. Champs de $db->errorInfo()

ÉlémentInformation
0Code erreur SQLSTATE (un identifiant alphanumérique de cinq caractères défini dans le standard ANSI SQL).
1Code erreur spécifique au driver.
2Message d'erreur spécifique au driver.

Si le code erreur SQLSTATE n'est pas défini ou s'il n'y a pas d'erreur spécifique du driver, l'élément suivant l'élément 0 sera défini à NULL.

Exemple de traitement d'erreur

Pour gérer les éventuelles erreurs, les méthodes précédentes peuvent être utilisée de cette façon (ici on exécute une requête $req définie par ailleurs) :

    $db->query($req);  // exécution de la reqête
    if ($db->errorCode()!=0) {   // il y a une erreur
        echo "<b>Erreur</b> sur la requête <tt>$req</tt><br />\n";
        $t=$db->errorInfo();   // récupération des informations sur l'erreur
        echo "<b>Code erreur SQLSTATE :</b> ".$t[0]."<br />\n";
        echo "<b>Code erreur spécifique au driver :</b> ".$t[1]."<br />\n";
        echo "<b>Message d'erreur :</b><blockquote><p>".$t[2]."</p></blockquote>\n";
        echo "<b>Le programme a été interrompu</b>";
        die();
    }