PHP PDO - Gérer les erreurs
jordane45
Messages postés
38486
Date d'inscription
Statut
Modérateur
Dernière intervention
-

- Activer l'affichage des erreurs PDO
- Détecter les erreurs dans les requêtes
- Que faire si le message d'erreur concerne un souci dans la requête
Activer l'affichage des erreurs PDO
Par défaut PDO n'affiche pas les différentes erreurs liées au code ou aux requêtes.Pour les faire apparaitre, vous devez activer l'option lors de la connexion.
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Comme ceci:
try{ $bdd =new PDO('mysql:host=localhost; dbname=mabdd; charset=utf8', 'user', 'password'); // Activation des erreurs PDO $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch(PDOException $e) { die('Erreur : ' . $e->getMessage()); }
<ital>NB: N'oubliez pas de placer le code de connexion à votre BDD dans un fichier à part que vous n'aurez qu'à inclure (via un REQUIRE_ONCE) dans les pages où vous en avez besoin).
NB²: Pensez également à activer l'affichage des erreurs PHP en activant l'option dans le php.ini ou en plaçant, au début de vos scripts PHP la ligne de code suivante :
error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE);
https://www.php.net/manual/fr/function.error-reporting.php
Détecter les erreurs dans les requêtes
Pour "trapper" les éventuelles erreurs de code ou de requêtes vous devez utiliser des blocs TRY/CATCH. ( il faut mettre CHAQUE requête dans un bloc try/catch !)Par exemple :
//préparation de la requête et des variables $sql = "INSERT INTO matable (champ1,champ2) VALUES (:valeur1,:autrevaleur)"; $datas = array(':valeur1'=>$valeur1, ':autrevaleur'=>$toto); //Execution de la requete try{ $requete = $bdd -> prepare($sql) ; $requete->execute($datas) ; }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " Les datas : " ; print_r($datas); }
NB: le fait de séparer la requête (le contenu de la variable $sql) de son exécution ( le prepare et le execute...) permet d'en faire un echo en cas de besoin. Idem pour les variables (contenues dans $datas).
Autre exemple ( une requête de type "select" )
$email = "test@exemple.fr"; // on prépare la requête et ses variables : $sql = "SELECT * FROM `users` WHERE email =:email "; $datas = [':email' => $email]; //Execution de la requete try { $requete = $db->prepare($sql); $requete->execute($datas); } catch (Exception $e) { // en cas d'erreur : echo " Erreur ! " . $e->getMessage(); echo " Les datas : "; print_r($datas); } $result = $requete->fetchAll(); // on stocke le résultat dans un array
Que faire si le message d'erreur concerne un souci dans la requête
C'est un autre sujet ...mais je peux déjà vous dire qu'il faut impérativement tester vos requêtes DIRECTEMENT dans votre BDD (en passant par exemple par phpmyadmin si vous êtes en mysql ou un logiciel comme heidiSql).
Cela vous permettra de savoir exactement d'où provient l'erreur... un nom de champ ou de table mal orthographié ... un espace oublié ... des quotes manquantes...etc....