2011-06-23 15 views
2

PHPのPDOクエリでtry/catchブロックを使用するベストプラクティスの方法に関する基本的な質問があります。私は、クエリを持って言う:PDOクエリの例外を処理する最良の方法

$sql = "SELECT id FROM table WHERE name = ?"; 
$sth = $dbh->prepare($sql); 
$sth->bindValue(1, $param); 
$sth->execute(); 
$result = $sub_sth->fetchColumn(); 

tryブロックでこれをカプセル化し、SQL構文または実行のいずれかで例外をキャッチするためのベストプラクティスの方法は何ですか?

N.B. PDO接続自体($ dbh)には既に例外処理があります。

+1

HTTP(SQL ->prepareと構文エラーのためにそうである私見。): //php.net/manual/en/pdo.error-handling.php –

答えて

2

通常、エラー処理はできるだけアトミックにすると便利です。別のtry/catchブロックで例外をスローする可能性のあるステートメントをそれぞれカプセル化します。この場合

、例外をスローする可能性のステートメントは、次のとおりです。大型のtry/catchブロックとは対照的に、

$sth = $dbh->prepare($sql); 

$sth->execute(); 

この粒度は、あなたは精度の問題のトラブルシューティングすることを可能にします問題の原因となったコードのセクションが見つかりました。

被験者の詳細な治療については、Ralph Shindler's articleを参照してください。

1

構成に応じて、PDOはエミュレートされたプリペアドステートメントを使用します。したがって、->prepare呼び出し自体は例外をトリガーしません。そのため、prepare->executeを同じブロックにラップする必要があります。

実際に準備されたクエリでの私の経験では、とにかく->execute呼び出しでのみ例外が発生することは珍しいことです。これは最も一般的に間違ったSQLクエリです。しかし、これは実行時の問題ではなく、開発上の問題です。したがって、準備のための例外をキャッチすることはあまり論理的ではありません。

とにかく、私のアドバイスは、あなたが本当に問題から2つの異なる方法で回復する方法を考え出すことができない限り、両方をラップすることです

+0

これまでの良い情報をありがとう。これは私の場合に役立ちました:http://www.php.net/manual/en/class.pdoexception.php#99518 –

関連する問題