- ベストアンサー
SQLの処理結果の判定方法と中断処理について
- MySQLのアップデートやインサートを含む処理の正常判定方法について説明します。
- 処理の途中で中断していた場合に、その前の処理を取り消す方法についても説明します。
- 複数回の判定が必要な場合には、If文を使用するより効率的な方法もあります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 上でも紹介していますが、「1回1回エラーチェックする」というコーディングスタイル自体がもう昔のものになってきています。PDOはモダンな例外処理をサポートしていて、これを利用すれば一箇所にCatchブロックを設けるだけで済みます。 また、PDOではトランザクション処理はメソッドとしてサポートされています。 beginTransactionメソッドでトランザクション開始。 ↓ PDOの大元のTryブロックとは別に、トランザクション用のTryブロックを内側に更に設ける。 ↓ 必要な処理をこの中で行い、その最後にcommitメソッドを実行。例外が発生したときはCatchブロックにてrollBackメソッドを実行、必要であれば外側のCatchブロックに向けて捕まえた例外をスローし直す。 ちなみにトランザクション処理中であれば、最後のINSERT時にAUTO_INCREMENTで自動生成されたプライマリキーの値をlastInsertIdメソッドでSQLを発行せずに取得することができるというちょっとしたオマケもあります。
その他の回答 (2)
- agunuz
- ベストアンサー率65% (288/438)
どういう記述をしているのかによります。 PDOでexecであれば戻り値は「作用した行数」です http://www.php.net/manual/ja/pdo.exec.php executeなら真偽値です。 http://www.php.net/manual/ja/pdostatement.execute.php 質問者さんが想定しているupdateでの「失敗」というのが対象データがなかったことを捉えたいなら、execを使って戻り値(作用した行数)をチェックしてください。 また何らかの「エラー」を捉えたいなら(PDO::ERRMODE_EXCEPTIONで)例外を捕捉するようにすべきです。 http://www.php.net/manual/ja/pdo.setattribute.php なお、複数の処理をまとめて行うときにはトランザクションを使うべきです。 http://dev.mysql.com/doc/refman/5.1/ja/commit.html (蛇足) 例示されたupdateなら、selectの時点でselect for updateですよね? http://dev.mysql.com/doc/refman/5.1/ja/select.html
- maiko0318
- ベストアンサー率21% (1483/6969)
http://dev.mysql.com/doc/refman/4.1/ja/commit.html すべての一連の更新をなかったことにすることが出来ます。Rollback そして一連の更新が正常に終わった時、完了することが出来ます。Commit 一連の処理ごとにCommitをかけておかないとRollbackで全て戻ってしまいますからご注意を。