Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2011, 20h16   #1
Invité de passage
 
Inscription : février 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 9
Points : 1
Points : 1
Par défaut Gestion des erreurs, affichage de la requête

Salut,

Je passe de mysql_ à pdo et j'aimerais pouvoir afficher une erreur lorsqu'une requête ne passe pas et aussi afficher cette requête...
Alors j'ai vu l'utilisation du try/catch() mais je vois également dans la doc :
- PDO::errorInfo() - Retourne les informations associées à l'erreur lors de la dernière opération sur la base de données
- PDOStatement::errorCode() - Récupère le SQLSTATE associé lors de la dernière opération sur la requête
- PDOStatement::errorInfo() - Récupère les informations sur l'erreur associée lors de la dernière opération sur la requête

Cependant je n'arrive pas à utiliser ces méthodes...
Code :
1
2
3
4
5
6
7
8
9
 
$c = new PDO(...);
$result = $c->prepare('SELECT * FROM mauvaisetable');
$result->execute();
if (!$result)
{
   echo "\nPDO::errorInfo():\n";
   print_r($c->errorInfo());
}
cela ne me retourne rien de particulier malgré l'erreur volontaire sur le nom de la table...pourtant c'est dans la doc..ou c'est moi qui l'utilise mal ?

- J'aimerais savoir si je peux afficher une erreur sql lisiblement sans try/catch() ? (un peu à la manière d'un mysql_error())
- J'aimerais savoir si je peux afficher ma requête (bonne ou mauvaise) après exécution afin de la relire...

Merci pour votre aide
pomme06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2011, 20h45   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Le code devrait être :
Code :
1
2
3
4
5
6
$ret = $result->execute();
if (!$ret) // à moins d'écrire directement : if (!$result->execute()) {
{
   echo "\nPDO::errorInfo():\n";
   print_r($result->errorInfo());
}
A défaut d'utiliser les exceptions, c'est la valeur (booléenne) retournée par execute, ici, qu'il faut tester. Non, l'objet PDOStatement déjà obtenu.

Concernant errorInfo, pour une requête préparée, c'est l'objet PDOStatement, et non PDO, qui doit servir de référent. Dixit la doc :
Citation:
PDO::errorInfo() retourne uniquement les informations des erreurs pour les opérations exécutées directement sur un gestionnaire de base de données. Si vous créez un objet PDOStatement avec la fonction PDO::prepare() ou la fonction PDO::query() et que vous invoquez une erreur sur le gestionnaire de requête, PDO::errorInfo() ne retournera pas l'erreur depuis le gestionnaire de requête. Vous devez appeler la fonction PDOStatement::errorInfo() pour retourner les informations sur l'erreur pour une opération exécutée sur un gestionnaire de requête particulier.
(avec une gestion d'erreurs basée sur les exceptions, ce point n'a plus besoin d'être considéré)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 00h28   #3
Invité de passage
 
Inscription : février 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 9
Points : 1
Points : 1
Ok pour cette réponse,

Cependant quand j'essaye:
Code :
1
2
3
4
5
6
7
8
 
$c = new PDO(...);
$result = $c->prepare('SELECT * FROM mauvaisetable');
if (!$result->execute())
{
   echo "\nPDO::errorInfo():\n";
   print_r($result->PDOStatement::errorInfo());
}
j'obtiens l'erreur suivante : Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

il n'y a donc rien de plus simple qu'un try/catch pour afficher une erreur ??
Comment s'utilise ce fameux "errorInfo()" ?
Le mystère reste entier pour afficher la requête exécuté dans le navigateur...

Si quelqu'un à des infos, je suis preneur
pomme06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 01h01   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Relisez le code que j'avais corrigé (les corrections sont en gras)

$c : votre objet PDO.
$result : l'objet PDOStatement correspondant à votre requête.


Quant à la gestion des erreurs, chacun fait comme bon lui semble (exceptions, avec ou sans try - set_exception_handler, ou non). Tout dépend des besoins et de ce qui paraît le moins "lourd".
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 01h29   #5
Invité de passage
 
Inscription : février 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 9
Points : 1
Points : 1
Code :
1
2
3
4
5
6
7
8
9
 
$c = new PDO(...);
$result  = $c->prepare('SELECT * FROM mauvaisetable');
$ret = $result->execute();
if (!$ret)
{
   echo "\nPDO::errorInfo():\n";
   print_r($result->errorInfo());
}
Avec ca tel quel, même en recopiant-collant scrupuleusement : rien ne s'affiche à par une fatall error
pomme06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 09h48   #6
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Il faut changer les 3 petits points dans les parenthèses de PDO() par quelque chose...
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 14h16   #7
Invité de passage
 
Inscription : février 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 9
Points : 1
Points : 1
LOL merci c'est ma connexion j'ai mis "..." pour abréger et éviter d'inscrire 'localhost', pseudo, mdp etc ... sinon le reste du code n'aurait pas fonctionner du tout lol.
pomme06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 15h50   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
fais un try...catch sur ta connexion :
http://www.php.net/manual/fr/pdo.construct.php

et active la gestion des erreurs :
http://php.net/manual/fr/pdo.error-handling.php
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 15h57   #9
Membre chevronné
 
Inscription : juin 2004
Messages : 747
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juin 2004
Messages : 747
Points : 741
Points : 741
Citation:
Envoyé par pomme06 Voir le message
LOL merci c'est ma connexion j'ai mis "..." pour abréger et éviter d'inscrire 'localhost', pseudo, mdp etc ... sinon le reste du code n'aurait pas fonctionner du tout lol.
pardon, je t'ai pris au mot quand tu écrivais "tel quel"
__________________
  • Mon blog PHP : http://blog.alterphp.com
  • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein
pc.bertineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 15h57   #10
Invité de passage
 
Inscription : février 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 9
Points : 1
Points : 1
Okay merci ça fonctionne mieux !!!
et je suis gourmand, mais auriez-vous une idée pour afficher la requête après exécution ??
pomme06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 17h28   #11
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
On peut récupérer le SQL de la requête préparée via l'attribut queryString (associé éventuellement à la méthode debugDumpParams).

Sinon il faut passer par une surcharge de PDOStatement notamment (de ce genre) ou le profiler (du moins pour MySQL).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 18h46   #12
Invité de passage
 
Inscription : février 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 9
Points : 1
Points : 1
Ok merci à vous tous ! sujet résolu !!
pomme06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h33.


 
 
 
 
Partenaires

Hébergement Web