Position actuelle: Accueil> Derniers articles> Lorsque la valeur de retour de PDO :: ErrorCode est «00000», comment déterminer avec précision si le fonctionnement de la base de données est vraiment un succès?

Lorsque la valeur de retour de PDO :: ErrorCode est «00000», comment déterminer avec précision si le fonctionnement de la base de données est vraiment un succès?

M66 2025-06-22

Lors de l'utilisation de PDO de PHP (objets de données PHP) pour les opérations de base de données, la méthode PDO :: ErrorCode () renvoie '00000' pour indiquer qu'aucune erreur ne s'est produite. Cela semble signifier que l'opération de la base de données se termine avec succès, mais en réalité, ErrorCode renvoie «00000» ne reflète pas toujours avec précision si l'opération est réellement réussie.

Cet article expliquera en détail pourquoi PDO :: ERRORCODE () renvoie `` 00000 '' et ne représente pas pleinement le succès de l'opération, et introduire plusieurs méthodes plus fiables pour juger si l'opération de base de données est vraiment réussie.


Pourquoi PDO :: ERRORCODE () renvoie-t-il «00000» ne signifie pas un succès à 100%?

'0000' renvoyé par PDO :: ErrorCode () est un code standard SQLState qui signifie "pas d'erreurs". Il reflète principalement s'il y a des erreurs pendant le processus de communication de la base de données, telles que les erreurs de syntaxe, les défaillances de connexion, etc.

Cependant, dans certains cas, même si l'instruction SQL est exécutée et qu'aucune erreur ne se produit, ErrorCode () renvoie toujours '00000' , mais le résultat de l'opération peut ne pas être idéal. Par exemple:

  • L'instruction de mise à jour a été exécutée, mais aucune ligne n'a été réellement mise à jour (car la condition ne correspondait à aucun enregistrement).

  • La déclaration de suppression a été exécutée, mais aucune ligne n'a été supprimée.

  • L'instruction INSERT a été exécutée, mais les données ont été modifiées par le déclencheur ou les contraintes n'étaient pas efficaces.

Ces situations ne provoquent pas d'erreurs, mais pour la logique métier, l'opération ne prend pas effet avec succès.


Comment déterminer avec précision si le fonctionnement de la base de données est vraiment un succès?

1. Utilisez RowCount () pour déterminer le nombre de lignes affectées

Pdostatement :: RowCount () Renvoie le nombre de lignes affectées par la dernière instruction SQL exécutée. C'est une base importante pour juger si la mise à jour et la suppression modifient vraiment les données.

 <?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');

$sql = "UPDATE users SET status = 1 WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 123]);

if ($stmt->errorCode() === '00000') {
    $affectedRows = $stmt->rowCount();
    if ($affectedRows > 0) {
        echo "Mettre à jour avec succès,Il a affecté {$affectedRows} D&#39;ACCORD。";
    } else {
        echo "执D&#39;ACCORD成功,但没有D&#39;ACCORD被更新。";
    }
} else {
    echo "Une erreur s&#39;est produite dans le fonctionnement de la base de données,Code d&#39;erreur:" . $stmt->errorCode();
}
?>

Ici, bien que ErrorCode () soit '00000' , uniquement si RowCount () est supérieur à zéro est considéré comme vraiment modifié.


2. Vérifiez via LastInsertid () après avoir inséré des données

Pour le fonctionnement d'insertion de la clé primaire de mise en oin, l'ID d'enregistrement inséré peut être obtenu via PDO :: LastInsertid () . Si un ID non vide et raisonnable est retourné, l'insertion est réussie.

 <?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');

$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => 'Zhang San', ':email' => 'zhangsan@example.com']);

if ($stmt->errorCode() === '00000') {
    $lastId = $pdo->lastInsertId();
    if ($lastId) {
        echo "Insérer avec succès,Nouveaux utilisateursIDpour:{$lastId}";
    } else {
        echo "执D&#39;ACCORD成功,Mais aucun nouvel insert n&#39;a été retournéID。";
    }
} else {
    echo "Une erreur s&#39;est produite dans le fonctionnement de la base de données,Code d&#39;erreur:" . $stmt->errorCode();
}
?>

Notez que la clé principale de LastInsertid () dépend de la table de la base de données, sinon la valeur de retour peut être vide.


3. Catch des exceptions et utilisez le contrôle des transactions pour être plus sécurisé

Lorsque vous effectuez plusieurs opérations ou des opérations complexes, activer les transactions et capturer des exceptions est le moyen le plus sûr d'assurer l'atomicité opérationnelle.

 <?php
try {
    $pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $pdo->beginTransaction();

    $sql1 = "UPDATE accounts SET balance = balance - 100 WHERE user_id = :user_id";
    $stmt1 = $pdo->prepare($sql1);
    $stmt1->execute([':user_id' => 1]);
    if ($stmt1->rowCount() === 0) {
        throw new Exception("La déduction du compte a échoué,无受影响D&#39;ACCORD数");
    }

    $sql2 = "UPDATE accounts SET balance = balance + 100 WHERE user_id = :user_id";
    $stmt2 = $pdo->prepare($sql2);
    $stmt2->execute([':user_id' => 2]);
    if ($stmt2->rowCount() === 0) {
        throw new Exception("La recharge du compte a échoué,无受影响D&#39;ACCORD数");
    }

    $pdo->commit();
    echo "Transférer avec succès";
} catch (Exception $e) {
    $pdo->rollBack();
    echo "L&#39;opération a échoué,raison:" . $e->getMessage();
}
?>

Ici, toute opération n'est pas valide et lèvera une exception, reculera la transaction et évitera l'incohérence des données.


Résumer

  • PDO :: ERRORCODE () Renvoie '00000' pour indiquer aucune erreur, mais ne signifie pas que l'opération a un effet réel.

  • La combinaison de Pdostatement :: RowCount () pour déterminer le nombre de lignes affectées est la clé pour déterminer si l'opération de modification est vraiment efficace.

  • Pour l'opération d'insertion, utilisez PDO :: LastInsertid () pour confirmer si l'insertion est réussie ou non.

  • Il est recommandé d'utiliser des transactions et une capture d'exceptions pour des opérations complexes afin d'assurer l'intégrité et la précision des opérations de données.

Grâce aux méthodes ci-dessus, nous pouvons déterminer plus précisément si le fonctionnement de la base de données est vraiment un succès, en évitant les vulnérabilités logiques causées par le fait de s'appuyer uniquement sur ErrorCode () .