Mysql
 sql >> Base de données >  >> RDS >> Mysql

PDO SQL-state 00000 mais toujours une erreur ?

C'est parce que $pdo->errorInfo() fait référence à la dernière instruction qui a été exécutée avec succès. Depuis $sql->execute() renvoie false, alors il ne peut pas faire référence à cette déclaration (ni à rien, ni à la requête précédente).

Pourquoi $sql->execute() renvoie false, je ne sais pas... soit il y a un problème avec votre $params tableau ou avec votre connexion à la base de données.

Remarque :Le manuel PHP (http://php.net/manual/en/pdo .errorinfo.php ) ne définit pas exactement ce que signifie "dernière opération sur le handle de base de données", mais s'il y avait un problème avec les paramètres de liaison, cette erreur se serait produite dans PDO et sans aucune interaction avec la base de données. Il est prudent de dire que si $pdo->execute() renvoie true , que $pdo->errorInfo() est valable. Si $pdo->execute() renvoie false , le comportement de $pdo->errorInfo() n'est pas explicitement clair dans la documentation. Si je me souviens bien de mon expérience, execute renvoie true , même si MySQL a renvoyé une erreur, renvoie false si aucune opération n'a été effectuée. Étant donné que la documentation n'est pas spécifique, elle peut être spécifique au pilote db.

Cette réponse reflète l'expérience pratique au moment de sa rédaction en septembre 2012. Comme l'a souligné un utilisateur, la documentation ne réaffirme pas explicitement cette interprétation. Cela peut également ne refléter que l'implémentation particulière du pilote de base de données, mais il doit toujours être vrai que si $pdo->execute() renvoie true , que $pdo->errorInfo() est valide.

Vous pouvez également définir PDO::ERRMODE_EXCEPTION dans votre séquence de connexion. La gestion des exceptions rend inutile la vérification et l'interrogation de l'erreur.

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