レコードの配列、つまり複数のレコードを保存すると、中央のレコードの1つにエラー(SQL)がある場合、どうなりますか?以後、すべてのレコードが挿入されないか、現在の行のみ、またはまったく挿入されませんか?どのように状況を処理する必要がありますか?前回のクエリでエラーが発生した場合、後で何が起こるか
PDOドライバは、MySQL
レコードの配列、つまり複数のレコードを保存すると、中央のレコードの1つにエラー(SQL)がある場合、どうなりますか?以後、すべてのレコードが挿入されないか、現在の行のみ、またはまったく挿入されませんか?どのように状況を処理する必要がありますか?前回のクエリでエラーが発生した場合、後で何が起こるか
PDOドライバは、MySQL
一般的な解決策はTRANSACTION
(mysql)(pgsql)(mssql)を使用することです。あなたがそれを使って何をすることができ、どのくらいの制御を持っているかは、RDBMSに依存します。たとえば、PostgreSQLではSAVEPOINT
を作成できます。これにはROLLBACK TO
を指定できます。
もう1つの解決策は、STORED PROCEDURE
です。その場合、エラーが発生した場合に何が起こるかを指定できますDECLARE .. HANDLER
私は現在のerrorsomeクエリの実行以外のものを続けたい...そうなるだろう – aWebDeveloper
いいえ、MySQLのトランザクションではできませんこの。あなたのケースのストアドプロシージャは実行可能ではないかもしれません。常に準備された文を作成し、その文を新しいデータのループで実行することができます。エラーが発生した場合、 'execute()'メソッドは 'false'を返します。 –
PDO-取引を見てみましょうです:http://php.net/manual/en/pdo.begintransaction.php
あなたはエラーがあったかどうかをチェックし、ので、あなたのコミットをロールバックしたり、
エラーがある場合はロールバックする必要がありますトランザクションのない別のクエリかどうか –
はい、私はあなたがその文書を読むのに助言します。 – worenga
ありがとう、@ satoshi良い例があります。http://stackoverflow.com/a/9925679/744255 –
これらの状況はdatabase transactionsで管理されます。
古典的な例は、私の口座から別の口座にお金を移したいときです。
にお金を入れて2番目のクエリが失敗した場合、私は最初のものにしたい:やるべき2つのクエリがあります。ロールバックしてユーザーにエラーを通知します。それがトランザクションの目的です。
トランザクションを使用しない場合、2番目のクエリが失敗すると、最初のクエリは実行され、ロールバックされません(したがって、金額は消えます)。これはMySQLのデフォルト動作です。
+1です。 –
私は現在のerrorsomeクエリの実行以外のものを続行したい...そうなるだろう – aWebDeveloper
どのようなエラーが発生しますか?そして、どのRDBMS? –
私はSQLエラーはいくつかのフィールド/レコードがNULLだと言っているが、データベースごとには – aWebDeveloper
ではいけません。最初の問題(エラー)を開始するとMysqlが終了します –