web-dev-qa-db-fra.com

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 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 parle de retour d'information par programme.

84
Chris

PDOStatement->execute() renvoie true en cas de succès. Il y a aussi PDOStatement->errorCode() que vous pouvez vérifier les erreurs.

120
Ólafur Waage

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

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

  1. Pour dire le succès, aucune vérification n'est nécessaire. Restez juste avec votre flux de programme.
  2. Pour gérer l'erreur inattendue, conservez-le - aucun code de traitement immédiat n'est nécessaire. Une exception sera levée en cas d'erreur de base de données et sera renvoyée au gestionnaire d'erreurs à l'échelle du site, ce qui aboutira éventuellement à une page d'erreur 500 commune.
  3. Pour gérer l'erreur attendue, comme une clé primaire en double, et si vous avez un scénario particulier pour gérer cette erreur particulière, utilisez un opérateur try..catch.

Pour un utilisateur régulier PHP, cela peut sembler un peu étrange - comment se fait-il que ce ne soit pas de vérifier le résultat direct de l'opération? - mais c'est exactement comme cela que fonctionnent les exceptions - vous vérifiez l'erreur ailleurs. pour tous. extrêmement pratique.

Donc, en un mot: dans un code standard, vous n'avez pas du tout besoin de gérer les erreurs. Il suffit de garder 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 affichée par votre application pour une telle occasion.

Seulement dans le cas où vous avez un scénario de traitement autre que le simple signalement de l'erreur, placez votre instruction Insert dans un opérateur try..catch, Vérifiez si était l'erreur à laquelle vous vous attendiez et que vous avez gérée; ou - si l'erreur était différente - relancez l'exception , pour pouvoir être traitée de manière habituelle par le gestionnaire d'erreurs au niveau du site. 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 si une erreur particulière est exécutée et réexécutons l'exception pour toute autre erreur (aucune table de ce type, par exemple) qui sera signalée à un programmeur.

Tandis que encore - juste pour dire à un utilisateur quelque chose comme "Votre insertion a été réussie" , aucune condition n’est jamais nécessaire.

23

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

9
Dominic Rodger

Si une requête de mise à jour s'exécute avec des valeurs correspondant à l'enregistrement de base de données actuel, alors $stmt->rowCount() renverra 0 Car aucune ligne n'a été affectée. Si vous avez une if( rowCount() == 1 ) pour tester votre succès, vous penserez que la mise à jour a échoué lorsqu'elle n'a pas échoué, mais que les valeurs étaient déjà dans la base de données, de sorte que rien ne change.

$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 clé unique qui a été violé. La requête a abouti, mais une autre requête renvoie l'ancienne valeur de champ.

8
dan

Vous pouvez tester le nombre de lignes

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

Utiliser id comme clé primaire avec incrémentation automatique

$stmt->execute();
$insertid = $conn->lastInsertId();

incremental id est toujours plus grand que zéro même lors du premier enregistrement, ce qui signifie qu'il retournera toujours une valeur vraie pour id coz plus grand que zéro signifie vrai en PHP

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";
0
jumper rbk

PDOStatement-> execute () peut lever une exception

alors ce que vous pouvez faire c'est

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
0
Sumit P Makwana