PHP PDO - Gérer les erreurs

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 - Modifié le 28 juin 2022 à 15:00

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....