私はPDOを使用して、データベースのWebサイトインターフェイスを書き換えています。私はmysqlの拡張機能を使用していましたが、エラー処理に悩まされたことは一度もありませんでした。PDO例外質問 - キャッチする方法
今、私はこれを正しく実行したいと思います。しかし、私はどのようにしたいと思いますか(MySQLの "重複エントリ"、 "Null値"などのエラー)をキャッチする問題を抱えています。私のステートメントのどれがtryブロック内にある必要がありますか?それはすべてそこにあるべきですか? Include()
を使用して自分のDBに接続しています(独自のエラー処理があります)。このコードではエラーが発生したクエリの実行のみです。
try {
$stmt = $db->prepare("INSERT INTO tbl_user (id, name, password, question, answer) VALUES (NULL, :name, :password, :question, :answer)");
$stmt->bindValue(":name", $_POST['name']);
$stmt->bindValue(":password", $_POST['password']);
$stmt->bindValue(":question", $_POST['question']);
$stmt->bindValue(":answer", $_POST['answer']);
$stmt->execute();
echo "Successfully added the new user " . $_POST['name'];
} catch (PDOException $e) {
echo "The user could not be added.<br>".$e->getMessage();
}
だから私の質問:そのすべてはtryブロックにする必要がない、次のコードを実行するとき、それはエラーをキャッチしていない理由を私は理解できませんか? executeブロックをtryブロックに置くことはできますか?エラーDuplicate value "John" in key "name"
をキャッチする必要がありますが、代わりに成功メッセージが表示されます。 (2人の "John"ユーザーを追加しようとすると)。私はPHPMyAdminをチェックした。索引は一意であり、このコードを使用しないで、予期したとおりにエラーをスローします。
'$ db'の' PDO :: ATTR_ERRMODE'を 'PDO :: ERRMODE_EXCEPTION'に設定する必要がありますので、エラー時に例外がスローされます。 – FtDRbwLXw6
ドキュメントやソースコードをチェックし、どの関数が 'PDOException'を投げるのか調べるべきです。それで、あなたはtryブロックに入れるコードの部分を知っているでしょう:) –
'ATTR_ERRMODE'を固定して愚かな気持ちになりました。どのくらいの文をtryブロックに入れるべきですか?コードが再利用されるかもしれません(bindValue()のほんの少しのステートメントが変更された後にexecuteされます)。 tryブロックに文全体を入れることに利点がありますか、またはexecute()だけが必要ですか? – StuckAtWork