フラッシュのボタンから $_['post'] データを受け取る PHP スクリプトがあります。ユーザーがそのボタンをダブルクリックすると、データが 2 回送信されることがあります。サーバー側で mysql 更新の競合が発生します。少しの時間差で、同じクライアントからの php の追加のリクエストを無視するにはどうすればよいですか?
3 に答える
1
mysql でテーブルをロックすることについて聞いたことがありますか?
詳細を提供せずに詳細な例を提供することはできませんが、基本的な例は次のとおりです。
mysql_query( "LOCK TABLES updates READ WRITE", $connection);
$q = mysql_query("SELECT COUNT(*) FROM updates WHERE user = $currentUser AND time...");
if( mysql_result($q, 0, 0) != 0){
// Someone's already doing update; exit
mysql_query( "UNLOCK TABLES;");
return false;
}
// Require lock for ourselves
mysql_query( "INSERT INTO updates ...");
mysql_query( "UNLOCK TABLES;");
// Do the stuff on database
これにより、同じユーザーがこれを 2 回実行しようとしても、許可されません (一度に 1 回の更新のみ)。
さまざまなオプションもあります。
- 使用する
TRANSACTION
- 更新用の 1 回限りのトークンを生成します (アトミック性に注意してください。中断されるか、テーブル ロックを再度使用する必要が
DELETE FROM ...
あるため、影響を受ける行を実行してからチェックする必要があります)。SELECT; DELETE
- と私のお気に入りのもの:
button.enable=false
、および要求に応じて完了button.enabled=true
注: コードは SQL インジェクションに対して脆弱であり、mysql_
関数は古くなっています。
于 2012-10-04T14:22:47.973 に答える
0
データベースに最後に更新されたタイムスタンプを持っていて、それを現在の時刻と照合してみませんか。最後の数秒である場合は、MySQL クエリを実行しないでください。
于 2012-10-04T14:08:22.513 に答える
0
非表示のランダム値をフォームに追加し、表示された値のテーブルを維持できるため、基本的な保護メカニズムを追加できます。このテーブルから、メイン クエリを実行する前に使用済みの値を削除できます。これにより、XSSも防止されます。
于 2012-10-04T14:11:28.270 に答える