J'utilise PDO pour insérer un enregistrement (mysql et php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Existe-t-il un moyen de savoir s'il a été inséré avec succès, par exemple si l'enregistrement n'a pas été inséré parce qu'il s'agissait d'un doublon?
Edit: bien sûr, je peux consulter la base de données, mais je veux dire des commentaires programmatiques.
if ($stmt->execute()) { //true }
PDOStatement->execute()
etPDOStatement->errorCode()
totalement cohérent les uns avec les autres? Y a-t-il des circonstances oùPDOStatement->errorCode()
a quelque chose maisPDOStatement->execute()
renvoie vrai? Ou quandPDOStatement->execute()
retourne faux maisPDOStatement->errorCode()
n'a rien?Étant donné que le mode d'erreur le plus recommandé pour PDO est
ERRMODE_EXCEPTION
, aucuneexecute()
vérification directe des résultats ne fonctionnera jamais . Comme l'exécution du code n'atteindra même pas la condition proposée dans d'autres réponses.Il existe donc trois scénarios possibles pour gérer le résultat de l'exécution de la requête dans PDO:
try..catch
opérateur.Pour un utilisateur PHP régulier, cela semble un peu étranger - comment faire, ne pas vérifier le résultat direct de l'opération? - mais c'est exactement ainsi que fonctionnent les exceptions - vous vérifiez l'erreur ailleurs. Une fois pour toute. Extrêmement pratique.
Donc, en un mot: dans un code normal, vous n'avez pas du tout besoin de gestion des erreurs. Gardez simplement votre code tel quel:
En cas de succès, il vous le dira, en cas d'erreur, il vous montrera la page d'erreur habituelle que votre application affiche pour une telle occasion.
Seulement dans le cas où vous avez un scénario de gestion autre que simplement signaler l'erreur, mettez votre instruction d'insertion dans un
try..catch
opérateur, vérifiez s'il s'agit de l'erreur que vous attendiez et gérez-la; ou - si l'erreur était différente - relancez l'exception, pour qu'elle puisse être gérée par le gestionnaire d'erreurs à l'échelle du site de la manière habituelle. Voici l'exemple de code de mon article sur la gestion des erreurs avec PDO :Dans le code ci-dessus, nous vérifions l'erreur particulière pour prendre des mesures et relançons l'exception pour toute autre erreur (aucune table de ce type par exemple) qui sera signalée à un programmeur.
Encore une fois - juste pour dire à un utilisateur quelque chose comme "Votre insertion a réussi", aucune condition n'est jamais nécessaire.
la source
query()
fonction? Puis-je utiliser try-catch pourquery()
au lieu deprepared()->execute()
?Essayez de regarder la valeur de retour de
execute
, qui estTRUE
en cas de succès etFALSE
en cas d'échec.la source
Si une requête de mise à jour s'exécute avec des valeurs qui correspondent à l'enregistrement de base de données actuel, elle
$stmt->rowCount()
sera renvoyée0
car aucune ligne n'a été affectée. Si vous avez unif( rowCount() == 1 )
test de réussite, vous penserez que la mise à jour a échoué alors qu'elle n'a pas échoué mais que les valeurs étaient déjà dans la base de données, donc rien ne change.Cela n'a pas fonctionné pour moi lorsque j'ai essayé de mettre à jour un enregistrement avec un champ de clé unique qui a été violé. La requête a renvoyé le succès mais une autre requête renvoie l'ancienne valeur de champ.
la source
if($stmt->execute() && ($stmt->rowCount()>0))
Vous pouvez tester le nombre de lignes
la source
SELECT
requêtes (et même là, la documentation parle de plusieurs requêtes). Il ne dit rien surDELETE
,INSERT
ouUPDATE
, ce qui semble bien fonctionner (la question portait sur uneINSERT
requête). Cependant, je suis nouveau sur PDO et si je me trompe et que quelqu'un a d'autres références, veuillez les écrire ici. Je suis intéressé de voir s'il y a de réels inconvénients pour les 3 commandes ci-dessus.Utiliser l'ID comme clé primaire avec incrémentation automatique
id incrémental est toujours plus grand que zéro même sur le premier enregistrement, ce qui signifie qu'il retournera toujours une valeur vraie pour id coz plus grand que zéro signifie vrai en PHP
la source
PDOStatement-> execute () peut lever une exception
alors ce que tu peux faire c'est
la source