Traitement erreurs personnalisées SQL/PDO/PHP

Résolu
DebianCoq Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -  
DebianCoq Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   -
Bonsoir,

Je me lance dans la réalisation d' un nouveau site sur lequel j'aimerais personnaliser la gestion des erreurs, après diverses recherches sur google je n' ai toujours pas trouvé de solution adaptée à mes besoins, donc, étant amateur, je me lance dans divers essais afin de trouver ce qu' il me faut...

J' ai donc essayer volontairement quelques erreurs et je suis étonné que le code suivant ne me retourne aucune erreur alors que je fais une requete sur une table inexistante...


$sql = Sql::$connexion; // Ouvre une connexion avec PDO

try {

$req = $sql->prepare("SELECT nom FROM table_inexistante WHERE id = ?");
$req->execute(array(0));
$res = $req->fetch(PDO::FETCH_OBJ);

$req->closeCursor();
}

catch (PDOException $erreur) {

echo 'Erreur : '.$erreur->getMessage();
}


Je m' attendais à une erreur me disant que la table n' existe pas.

Est ce un comportement normal?

Et si oui: Y a t-il un moyen de voir ce genre d' erreur?
Si non: Qu 'est ce qui ne va pas?

Merci
A voir également:

3 réponses

DebianCoq Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   5
 
Merci Pitet pour la clarté ta réponse, c' est en effet ce que j' ai fini par comprendre après bien des tentatives infructueuses...

Et tout à coup, ça marche beaucoup mieux :D

En fait je n'utilise le try{...} catch{...} que pour ouvrir la connexion (simple précaution puisque je n' utilise qu' une seule base de donnée pour mon site) avec en cas d' erreur un message personnalisé.
Concernant les erreurs SQL je les recupere avec errorInfo() et les traite selon mes besoins...

Voici le script si ça interesse ou peut aider quelqu' un:


try {

//essai de se connecter a la base de donnee
$sql = new PDO( [Vos infos de connexion] );
}

catch(Exception $e) {

//Si ca ne se connecte pas on renvoie une erreur
trigger_error($e->getMessage(), E_USER_WARNING);
}

//Puis j' exécute une requete...

$req = $sql->prepare("SELECT 'nom' FROM 'table_inexistante'");
$req->execute(array());
$res = $req->fetch(PDO::FETCH_OBJ);

$req->closeCursor();

if($res) {

return($res->nom);
}

else {

// Recuperation de l' erreur
$res = $req->errorInfo();
unset($res[0]); // Facultatif

//Si il y a une erreur on renvoie un message d' erreur
trigger_error('(Sql #'.$res[1].') - '.$res[2], E_USER_WARNING);
}


Voilà avec ce principe j' obtiens de beaux messages d' erreur de type warning qui sont tous semblables, plus clairs et que je peux plus facilement retrouver et traiter après avoir enregistré dans un log.

Bonne soirée
1
DebianCoq Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   5
 
Un début de solution mais toujours mais je n' ai visiblement pas tout compris au fonctionnement de try.{...}catch{...}.

Voici le code modifié qui ressort bien l' erreur indiquant une table inexistante, cependant je m' attendais depuis le début à voir ce message apparaître dans catch{...}


try {

$req = $sql->prepare("SELECT nom FROM table_inexistante WHERE id = ?");
$req->execute(array(0));
$res = $req->fetch(PDO::FETCH_OBJ);

$req->closeCursor();

echo "<br />PDO::errorInfo() retourne les valeurs suivantes: <pre>";
print_r($req->errorInfo());
echo "</pre>";
}

catch (PDOException $erreur) {

echo 'Erreur : '.$erreur->getMessage();

}

Quelqu' un saurait il m' expliquer ce qui m' échappe? Merci
0
DebianCoq Messages postés 26 Date d'inscription   Statut Membre Dernière intervention   5
 
J' en déduis à tête reposée que ce genre d' erreur ne génère pas d' exception et que ce dernier code est valide. Merci
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Salut,

La réponse à ta question est sur cette page : https://www.php.net/manual/fr/pdo.error-handling.php

En résumé, par défaut PDO ne déclenche pas d'exception sur les erreurs SQL.

Bonne journée
0