0

フラッシュのボタンから $_['post'] データを受け取る PHP スクリプトがあります。ユーザーがそのボタンをダブルクリックすると、データが 2 回送信されることがあります。サーバー側で mysql 更新の競合が発生します。少しの時間差で、同じクライアントからの php の追加のリクエストを無視するにはどうすればよいですか?

4

3 に答える 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 に答える