Les erreurs et leur gestion
PDO vous offre 3 façons différentes de gérer les erreurs afin de mieux s'adapter à votre application.
-
PDO::ERRMODE_SILENT
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, vous pouvez 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, vous pouvez également appeler ces deux mêmes méthodes sur l'objet.
-
PDO::ERRMODE_WARNING
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, si vous voulez voir le problème sans interrompre l'application.
-
PDO::ERRMODE_EXCEPTION
En plus de définir le code d'erreur, PDO lancera une exception PDOException et y définit 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 de votre code, vous montrer rapidement le problème rencontré (souvenez-vous : les transactions sont automatiquement annulées si l'exception fait que votre script se termine).
Le mode "exception" est également très utile car ainsi, vous pouvez structurer votre gestionnaire d'erreur plus clairement qu'avec les alertes traditionnelles PHP et, ce, avec moins de code que lorsque vous exécutez votre code en mode silence, et que vous vérifiez 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. Si vous avez besoin d'informations spécifiques sur l'erreur, PDO vous 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';
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Échec lors de la connexion : ' . $e->getMessage();
}
?>
Note:
PDO::__construct() va toujours lancer une exception PDOException si la connexion échoue suivant la configuration de
PDO::ATTR_ERRMODE
. Les exceptions non attrappées deviennent des erreurs fatales.
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';
/*
L'utilisation des blocs try/catch autour du constructeur est toujours valide
même si nous définissons le ERRMODE à WARNING sachant que PDO::__construct
va toujours lancer une exception PDOException si la connexion échoue.
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Échec de la connexion : ' . $e->getMessage();
exit;
}
// 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 18
Version en cache
23/12/2024 00:17:48 Cette version de la page est en cache (à la date du 23/12/2024 00:17:48) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-pdo.error-handling.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.