1

PHPで2つの異なるmysqlクエリを実行し
ていますが、両方が成功したかどうかも確認する必要があります。そのうちの 1 つが失敗した場合は、エラーをスローして、行った変更を取り消す必要があります。

これを行う簡単な方法はありますか?

PS: 1 つは andupdateで、もう 1 つは aninsertです。

編集現在、私は2つのクエリを持っています:

INSERT INTO table1 ( warning ) VALUES ( 0 ) WHERE con_id = 1
UPDATE table2 SET no_alerts = 1 WHERE con_id = 1

基本的なmysql_挿入と更新を使用していますが、PDO は使用していません。

4

4 に答える 4

2

これを行う簡単な方法はありますか?

トランザクションはあなたが探しているものです。

私はプレーンな挿入と更新を使用していますが、PDO は使用していません。

「プレーンな挿入/更新」などはありません。古い機能の使用について話している場合は、使用mysql_*を中止してください。それらはもはや保守されておらず、コミュニティは非推奨プロセスを開始しています。赤いボックスが見えますか? 代わりに、準備済みステートメントについて学び、 PDOまたはMySQLiのいずれかを使用する必要があります。決められない場合は、この記事を参考にしてください。学習したい場合は、ここに良い PDO チュートリアルがあります。

PDO / mysqli を使用している場合は、トランザクションでクエリを実行できます。このようにして、変更をコミットする代わりに簡単にロールバックできます。

アップデート

古いシステム (PDO は 5.1.0+ で mysqli は 5+ ですが) が心配な場合は、できることがありますが、これはハックであり、エラーが発生しやすく、混乱する可能性があります。クエリの最後の挿入 ID を保存できます。更新クエリが失敗した場合は、挿入された行を手動で削除できますが、前述のように、これは並行システムでエラーが発生しやすい傾向があります。

クエリが失敗する理由は何ですか? たぶん、物事を行うためのより良い方法がありますか?

于 2012-09-27T14:49:26.030 に答える
0

私はあなたがこのようなものを探していると推測しています

$result1 = mysql_query('INSERT INTO table1 ( warning ) VALUES ( 0 ) WHERE con_id = 1');
$result2 = mysql_query('UPDATE table2 SET no_alerts = 1 WHERE con_id = 1');

if(!$result1 || !$result2) {
  echo 'error';
}

PDO を使用する必要があります... mysql_query は非推奨です。

于 2012-09-27T14:48:04.457 に答える
0
echo($resultQuery1 && $resultQuery2) ? 'No error' : 'Error';
于 2012-09-27T14:54:08.427 に答える
0

私が考える2つの方法。まず、挿入または更新できない可能性がある場合は、最初にテーブルの状態を確認して、可能かどうかを確認します。アトミック操作が必要な場合は、このプロセス中にテーブルをロックして、テーブルをチェックして更新を行う間に別のプロセスがテーブルを変更しないようにすることができます。ただし、高レベルの同時実行が必要な場合は、速度が低下する可能性があります。

または、トランザクション エンジン (InnoDB はトランザクション対応ですが、MyISAM は対応していません) を使用している場合は、トランザクションを開始し、更新と挿入の戻り値を監視できます。

START TRANSACTION

..次に、操作の結果を確認します。PHPドキュメントから:

SELECT、SHOW、DESCRIBE、EXPLAIN、および結果セットを返すその他のステートメントの場合、mysql_query() は成功するとリソースを返し、エラーの場合は FALSE を返します。

他のタイプの SQL ステートメント、INSERT、UPDATE、DELETE、DROP などの場合、mysql_query() は成功時に TRUE を返し、エラー時に FALSE を返します。

返された結果リソースは、返されたデータにアクセスするために、mysql_fetch_array() および結果テーブルを処理するためのその他の関数に渡される必要があります。

mysql_num_rows() を使用して、SELECT ステートメントに対して返された行数を調べるか、mysql_affected_rows() を使用して、DELETE、INSERT、REPLACE、または UPDATE ステートメントによって影響を受けた行数を調べます。

成功しない場合は、変更をロールバックできます。

ROLLBACK

最後に、あなたのアプリケーションについて詳しく知らないと確信が持てませんが、そもそもこのような状況にならないようにデータセットとアプリケーションを設計することで、より高速になる可能性があります。トランザクションとテーブルのロックはどちらも遅いので、必要でない限り避けています。

于 2012-09-27T14:54:50.687 に答える