Traitement erreurs personnalisées SQL/PDO/PHP

Résolu/Fermé
DebianCoq Messages postés 26 Date d'inscription lundi 20 janvier 2014 Statut Membre Dernière intervention 24 février 2016 - 20 janv. 2014 à 21:45
DebianCoq Messages postés 26 Date d'inscription lundi 20 janvier 2014 Statut Membre Dernière intervention 24 février 2016 - 21 janv. 2014 à 18:21
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 lundi 20 janvier 2014 Statut Membre Dernière intervention 24 février 2016 5
Modifié par DebianCoq le 21/01/2014 à 18:36
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 lundi 20 janvier 2014 Statut Membre Dernière intervention 24 février 2016 5
20 janv. 2014 à 22:32
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 lundi 20 janvier 2014 Statut Membre Dernière intervention 24 février 2016 5
21 janv. 2014 à 15:26
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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
21 janv. 2014 à 15:41
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