112 votes

PDO mysql : Comment savoir si l'insertion a réussi

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 si l'insertion a réussi, par exemple si l'enregistrement n'a pas été inséré parce qu'il s'agissait d'un doublon ?

Edit : bien sûr que je peux regarder la base de données, mais je veux dire un retour programmatique.

164voto

Ólafur Waage Points 40104

PDOStatement->execute() retourne vrai en cas de succès. Il existe également PDOStatement->errorCode() que vous pouvez vérifier pour les erreurs.

1 votes

Comment regarder la valeur de la fonction execute() ?

0 votes

Vous le stockez dans une variable ? C'est soit vrai, soit faux.

0 votes

Quelque chose comme ça ? $stmt -> execute() ; if($stmt){//true} if(!$stmt){//false}

31voto

Étant donné que le mode d'erreur le plus recommandé pour l'AOP est ERRMODE_EXCEPTION , pas de direct execute() la vérification des résultats ne fonctionnera jamais . Comme l'exécution du code n'atteindra même pas la condition proposée dans les autres réponses.

Ainsi, il y a trois scénarios possibles pour gérer le résultat de l'exécution d'une requête dans PDO :

  1. Pour raconter le succès, aucune vérification n'est nécessaire. Continuez simplement à suivre le déroulement de votre programme.
  2. Pour gérer l'erreur inattendue, gardez la même chose - aucun code de traitement immédiat n'est nécessaire. Une exception sera levée dans le cas d'une erreur de base de données, et elle remontera jusqu'au gestionnaire d'erreurs du site qui aboutira finalement à une page d'erreur 500 commune.
  3. Pour gérer l'erreur attendue, comme une clé primaire dupliquée, et si vous avez un certain scénario pour gérer cette erreur particulière, alors utilisez un fichier de type try..catch opérateur.

Pour un utilisateur régulier de PHP, cela semble un peu étrange - comment ça, ne pas vérifier le résultat direct de l'opération ? - mais c'est exactement comme ça que fonctionnent les exceptions - vous vérifiez l'erreur ailleurs. Une fois pour toutes. Extrêmement pratique.

Donc, en résumé : dans un code normal, vous n'avez pas besoin de gérer les erreurs. Gardez simplement votre code tel quel :

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever

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 manipulation à part rapporter l'erreur, mettez votre déclaration d'insertion dans une try..catch vérifiez s'il s'agissait de l'erreur attendue et traitez-la ; ou - si l'erreur était différente - relancer l'exception, afin qu'elle puisse être traitée par le gestionnaire d'erreurs du site de manière habituelle. Voici l'exemple de code de mon article sur la gestion des erreurs avec PDO :

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}
echo "Success!";

Dans le code ci-dessus, nous vérifions l'erreur particulière pour prendre des mesures et nous relançons l'exception pour toute autre erreur (pas de table par exemple) qui sera signalée au programmeur.

Alors qu'encore une fois - juste pour dire à un utilisateur quelque chose comme "Votre insertion a réussi". aucune condition n'est jamais nécessaire.

2 votes

Quelle est la signification de "Success" ? Est-ce que cela signifie qu'une nouvelle ligne a été insérée, ou qu'il n'y a pas d'erreur ?

0 votes

Pour la requête INSERT, c'est à peu près la même chose.

0 votes

Vous avez raison Pouvez-vous juste me dire ce qu'il en est de query() fonction ? Puis-je utiliser try-catch pour query() au lieu de prepared()->execute() ?

9voto

Dominic Rodger Points 44489

Essayez de regarder la valeur de retour de execute qui est TRUE sur le succès, et FALSE en cas d'échec.

9voto

dan Points 1

Si une requête de mise à jour s'exécute avec des valeurs qui correspondent à l'enregistrement actuel de la base de données, alors $stmt->rowCount() retournera 0 car aucune ligne n'a été affectée. Si vous avez un if( rowCount() == 1 ) pour tester le succès, 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 et que rien n'a changé.

$stmt->execute();
if( $stmt ) return "success";

Cela n'a pas fonctionné pour moi lorsque j'ai essayé de mettre à jour un enregistrement avec un champ de clé unique qui était violé. La requête a abouti, mais une autre requête renvoie l'ancienne valeur du champ.

4 votes

Si vous avez BESOIN que l'enregistrement soit inséré, la meilleure façon est de vérifier comme ceci ............................. ....................... if($stmt->execute() && ($stmt->rowCount()>0))

8voto

crafter Points 2304

Vous pouvez tester le rowcount

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }

0 votes

Une référence à la documentation est toujours utile @YourCommonSense. Il est dit " ce comportement n'est pas garanti pour toutes les bases de données et ne doit pas être utilisé pour des applications portables. "Mais il est limité à select d'abord, et ensuite supporté pour mysql, qui est le sujet de ce post.

0 votes

Il suffit de taper "pdo rowcount" dans la barre d'adresse de votre navigateur et de cliquer sur le premier lien. cela demande moins de frappe qu'un commentaire

1 votes

@crafter Correct. Il est dit que rowCount() peut être inutilisable pour SELECT (et même là, la documentation parle de multiple requêtes). Il ne dit rien sur DELETE , INSERT o UPDATE qui semblent bien fonctionner (la question portait sur un système de gestion de l'information). INSERT requête). Cependant, je suis nouveau dans PDO et si je me trompe et que quelqu'un a d'autres références, merci de les écrire ici. Je suis intéressé de voir s'il y a de réels inconvénients pour les 3 commandes ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X