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.
PDOStatement->execute()
renvoie true en cas de succès. Il y a aussi PDOStatement->errorCode()
que vous pouvez vérifier les erreurs.
É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:
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.
Essayez de regarder la valeur de retour de execute
, qui est TRUE
en cas de succès, et FALSE
en cas d'échec.
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.
Vous pouvez tester le nombre de lignes
$sqlStatement->execute( ...);
if ($sqlStatement->rowCount() > 0)
{
return true;
}
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";
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)
}