web-dev-qa-db-fra.com

Comment extraire un message d'erreur de PDO?

Je n'arrive pas à obtenir de message d'erreur de PDO:

#$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
try {
  $sth = $dbh->prepare('@$%T$!!!');
  print_r($sth);
  print_r($dbh->errorInfo());
} catch (PDOException $e) {
    echo $e->getMessage();
}

Il ne donne que:

PDOStatement Object
(
    [queryString] => @$%T$!!!
)
Array
(
    [0] => 00000
    [1] =>
    [2] =>
)

setAttribute n'aide en rien.

C'est PHP 5.3.3 Gestionnaire Apache 2.0
Pilote PDO pour MySQL activé
Version de l'API client mysqlnd 5.0.7-dev - 091210 - $ Révision: 300533 $

Que puis-je faire pour obtenir des informations sur les erreurs?

59
Your Common Sense

setAttribute will amènera PDO à lever des erreurs ou des exceptions - au plus tard lorsque vous exécuterez la requête.

Pour les instructions préparées émulées, il n'y a pas d'archivage dans prepare():

Les instructions préparées émulées ne communiquent pas avec le serveur de base de données, donc PDO :: prepare () ne vérifie pas l'instruction.

Mais il y en aura un dans execute() lorsque la requête sera envoyée au serveur.

Cependant, le pilote mySQL prend en charge les instructions natives préparées depuis mySQL 4.1, donc cela ne devrait pas s'appliquer. En utilisant

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

doit provoquer une exception pour la requête que vous utilisez.

65
Pekka 웃

Moi aussi, j'essayais d'obtenir les informations de errorInfo() au niveau du descripteur de base de données, mais j'ai fini par obtenir les informations au niveau de l'instruction avec PDOStatement::errorInfo()

Par PHP site Web:

PDO :: errorInfo () récupère uniquement les informations d'erreur pour les opérations effectuées directement sur le handle de base de données. Si vous créez un objet PDOStatement via PDO :: prepare () ou PDO :: query () et appelez une erreur sur le handle d'instruction, PDO :: errorInfo () ne reflétera pas l'erreur du handle d'instruction. Vous devez appeler PDOStatement :: errorInfo () pour renvoyer les informations d'erreur pour une opération effectuée sur un descripteur d'instruction particulier.

4
CINCHAPPS

Cela imprimera le code d'erreur ainsi que son message détaillé correspondant.

Conseil: ce n'est qu'une démonstration. Utilisez simplement à des fins de débogage. N'activez pas pour afficher les messages d'erreur au public dans une version finale.

try{
connection=$this->get_connection();//here i brought my connection string
connection->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
/**
Do your works here..
//$statement=$connection->prepare($sql);
//if you are using errorInfo use after prepare statement before execute.here in this method i am not using it.
//print_r($statement->errorInfo());
**/

$statement->execute();
}
catch(PDOException $e) {
              //this will echo error code with detail
              //example: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'nasme' in 'field list'
              echo $e->getMessage();
            }
//$statement=null;
3
aimme

Vous devez d'abord execute la requête, puis vérifier les erreurs: faites-le comme ceci:

 $sth->execute();

puis vérifiez les erreurs. Vous obtiendrez alors des erreurs, le cas échéant.

2
shamittomar