データベース操作にPHPのPDO(PHPデータオブジェクト)を使用する場合、 PDO :: ERRORCODE()メソッドは「00000」を返し、エラーが発生していないことを示します。これは、データベースの操作が正常に完了したことを意味するようですが、実際には、 ErrorCode Returns '00000」は、操作が実際に成功しているかどうかを常に正確に反映しているわけではありません。
この記事では、 PDO :: errorCode()が「00000」を返す理由を詳細に説明し、操作の成功を完全に表していないため、データベースの操作が本当に成功しているかどうかを判断するためのより信頼できる方法をいくつか紹介します。
PDO :: ERRORCODE()によって返される「0000」は、「エラーなし」を意味するSQLSTATE標準コードです。主に、構文エラー、接続障害など、データベース通信プロセス中にエラーがあるかどうかを反映しています。
ただし、場合によっては、SQLステートメントが実行され、エラーが発生しない場合でも、 ErrorCode()はまだ「00000」を返しますが、操作結果は理想的ではない場合があります。例えば:
更新ステートメントは実行されましたが、実際に更新された行はありませんでした(条件がレコードと一致しなかったため)。
削除ステートメントは実行されましたが、削除された行はありませんでした。
挿入ステートメントは実行されましたが、データはトリガーによって変更されたか、制約が効果的ではありませんでした。
これらの状況はエラーを引き起こすものではありませんが、ビジネスロジックの場合、操作は正常に有効になりません。
pdostatement :: rowcount()は、最後に実行されたSQLステートメントの影響を受ける行の数を返します。更新と削除がデータを本当に変更するかどうかを判断するための重要な基盤です。
<?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 "正常に更新します,影響を受けています {$affectedRows} わかりました。";
} else {
echo "执わかりました成功,但没有わかりました被更新。";
}
} else {
echo "データベース操作でエラーが発生しました,エラーコード:" . $stmt->errorCode();
}
?>
ここでは、 errorcode()は「00000」ですが、 rowcount()がゼロより大きい場合にのみ、真に変更されていると見なされます。
Autoincrementプライマリキーの挿入操作の場合、挿入されたレコードIDはPDO :: LastInsertID()を介して取得できます。空ではなく合理的なIDが返された場合、挿入は成功します。
<?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' => 'チャン・サン', ':email' => 'zhangsan@example.com']);
if ($stmt->errorCode() === '00000') {
$lastId = $pdo->lastInsertId();
if ($lastId) {
echo "正常に挿入します,新しいユーザーIDのために:{$lastId}";
} else {
echo "执わかりました成功,しかし、新しい挿入物は返されませんでしたID。";
}
} else {
echo "データベース操作でエラーが発生しました,エラーコード:" . $stmt->errorCode();
}
?>
LastInsertID()の主要なキーはデータベーステーブルに依存することに注意してください。そうしないと、返品値が空になる可能性があります。
複数の操作または複雑な操作を実行する場合、トランザクションをオンにし、例外をキャッチすることは、運用上の原子性を確保する最も安全な方法です。
<?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("アカウント控除は失敗しました,无受影响わかりました数");
}
$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("アカウント充電は失敗しました,无受影响わかりました数");
}
$pdo->commit();
echo "正常に転送します";
} catch (Exception $e) {
$pdo->rollBack();
echo "操作に失敗しました,理由:" . $e->getMessage();
}
?>
ここでは、任意の操作が無効であり、例外を投げかけ、トランザクションをロールバックし、データの矛盾を回避します。
PDO :: errorCode()は「00000」を返してエラーを示しませんが、操作が実際の効果をもたらすことを意味しません。
pdostatement :: rowcount()を組み合わせて影響を受ける行の数を決定することは、変更操作が本当に効果的かどうかを判断するための鍵です。
挿入操作には、 pdo :: lastinsertid()を使用して、挿入が成功したかどうかを確認します。
データ操作の完全性と精度を確保するために、複雑な操作にトランザクションと例外キャプチャを使用することをお勧めします。
上記の方法により、データベースの操作が本当に成功しているかどうかをより正確に判断できます。