web-dev-qa-db-fra.com

PDO SQL-state "00000" mais toujours une erreur?

Quelqu'un peut-il expliquer pourquoi

$sql->execute($params);

renvoie FALSE, alors que

print $pdo->errorCode();
print_r($pdo->errorInfo());

les deux renvoient SQLSTATE00000, ce qui signifie selon le succès de la documentation? C'est un INSERT et rien n'est réellement inséré dans la base de données ... alors, pourquoi est-ce que je reçois un message de succès de SQLSTATE?


Au cas où cela aiderait, c'est le code ...

$sql = $pdo->prepare("
        INSERT INTO user (
            username, fname, pass, salt, email,
            loc_id_home, country_id_home, region_id_home,
            cont_id_home, timestamp_reg, timestamp_upd, timestamp_lastonline, 
            online_status, gender, birthdate
            )
        VALUES (
            :username,:fname,:pass,:random_salt,:email,
            :loc_id_home,:country_id_home,:region_id_home,
            :cont_id_home,'".time()."','".time()."','".time()."',
            1,:gender,:birthdate)
        ");

$params=array(
    ':username'=>$username,
    ':fname'=>$fname,
    ':pass'=>$pass,
    ':random_salt'=>$random_salt,
    ':email'=>$email,
    ':loc_id_home'=>$loc_id_home,
    ':country_id_home'=>$country,
    ':region_id_home'=>$region,
    ':cont_id_home'=>$continent,
    ':gender'=>$gender,
    ':birthdate'=>$birthdate
);  

$sql->execute($params);

print $pdo->errorCode();
print_r($pdo->errorInfo());
26
Chris

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

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

PDO :: errorCode - Récupère le SQLSTATE associé à la dernière opération sur le handle de base de données

Remarque: Le manuel PHP ( http://php.net/manual/en/pdo.errorinfo.php ) ne définit pas exactement quelle "dernière opération sur le descripteur de base de données "signifie, 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 sûr de dire que si $pdo->execute() renvoie true, que $pdo->errorInfo() est valide. Si $pdo->execute() renvoie false, le comportement de $pdo->errorInfo() n'est pas explicitement clair dans la documentation. Si je me souviens correctement d'après mon expérience, exécutez renvoie true, même si MySQL a renvoyé une erreur, renvoie false si aucune opération n'a été effectuée. Comme 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. Il peut également refléter uniquement l'implémentation du pilote de base de données particulier, 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 );
16
user1122069

J'ai fait face au problème similaire,

Cela se produit virilement en raison de erreur dans la requête, essayez de exécutez votre requête dans php-myadmin ou de tout autre exécuteur de requête et confirmez que votre - la requête fonctionne très bien.
Même si notre syntaxe de requête est correcte, d'autres erreurs simples, comme laisser null ou non mentioan une colonne définie comme non nulle dans la structure de la table, provoqueront cette erreur (c'était l'erreur commise par moi).

Comme l'a expliqué user1122069, la raison de $ pdo-> errorInfo () indique que rien n'est faux peut être dû à

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

J'espère que cela aide :)

1
Renjith K N

Depuis le manuel php:

PDO :: ERR_NONE (chaîne) Correspond à SQLSTATE '00000', ce qui signifie que l'instruction SQL a été correctement émise sans erreur ni avertissement. Cette constante est pour votre commodité lors de la vérification de PDO :: errorCode () ou PDOStatement :: errorCode () pour déterminer si une erreur s'est produite. Vous saurez généralement si c'est le cas en examinant de toute façon le code retour de la méthode qui a déclenché la condition d'erreur.

Il semble donc qu'il ait inséré le disque. Vérifiez le dernier identifiant d'enregistrement dans votre table ... peut-être que vous l'avez raté?

1
Diego Saa

J'obtenais cette erreur à un moment donné. Je l'ai obtenu sur un seul serveur pour tous les échecs. Un serveur différent rapporterait l'erreur correctement pour les mêmes erreurs. Cela m'a amené à croire qu'il s'agissait d'une erreur de configuration du client MySQL. Je n'ai jamais résolu l'erreur spécifique, mais vérifiez vos configurations.

0
Matthew