0

プレーンなPHP5.3では、MySQLを使用して最初に古いレコードを削除し、ログを記録し、いくつかの小さな操作を実行してから、新しい置換レコードを追加するコードがあります。

削除コマンドは次のようになります。

DELETE FROM `rtable` WHERE `UserName`='%s';

そして、addコマンドは次のようになります。

INSERT INTO `table` (`UserName`,`Attribute`,`op`,`Value`) VALUES ('%s','%s','%s','%s');

奇妙なことに、挿入コマンドは正常に実行されていると実行されないように見えますが、デバッガーを有効にして一度に1行ずつ実行すると、機能しているように見えます。同様に、削除コマンドの後に2秒のスリープコマンドを挿入するとします。動作しているようです。したがって、挿入コマンドは削除コマンドの前に実行されているため、削除コマンドも新しいレコードを消去していると想定しています。

挿入コマンドを続行する前に、PHPに削除操作の終了を待機させるにはどうすればよいですか?

4

2 に答える 2

1

それは本当に奇妙に聞こえます。レプリケートされたデータベースクラスターがありますか?また、mysql_queryまたはその他のコマンドの戻り値を確認し、エラーメッセージを出力しますか(もちろん、本番環境のスクリプトには推奨されません)?

于 2012-09-27T09:39:57.813 に答える
1

PHPがプロセスをどのように処理し、連続したクエリがどのように実行されるかは完全にはわかりませんが、削除をトランザクションにカプセル化することを確実にしたい場合は、次のようにPDOを使用して行うことができます。

$dbh->beginTransaction();
$sth = $dbh->exec("DELETE FROM `rtable` WHERE `UserName`='%s'");
$dbh->commit();
// You could also pop a transaction around the inserts 
// in case another page tries to do the same
$sth = $dbh->exec("INSERT INTO `table` 
    (`UserName`,`Attribute`,`op`,`Value`) 
    VALUES ('%s','%s','%s','%s')");

ところで:私はあなたのクエリのバッククォートに一重引用符を修正する自由を取りました。

于 2012-09-27T09:40:41.623 に答える