0

私は使用のためのphpサインアッププロセスを持っています。ユーザーがサインアップ プロセスの最後から 2 番目のページに到達すると、すべてのサインアップの詳細と送信ボタン (基本的には [確認して支払う] ボタン) の概要が表示されます。ユーザーがこのボタンをクリックすると、これらすべての詳細が sql データベースに投稿され、そのユーザーがユーザー名とパスワードを使用して DB に作成されます。ここでの問題は、その送信ボタンを複数回クリックすると、データが再送信され、データベースに重複したエントリが作成され、各重複したエントリの詳細 (名前、電子メールなど) は同じですが、ユーザー名とパスワードが異なることです。これを防ぐにはどうすればよいですか?すぐに自分自身に送信してポストバックできることは知っていますが、どうすれば正確に行うことができますか? このコードを実装しようとしましたが、うまくいきません:http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmission

ありがとう

4

4 に答える 4

3

を使用して、フォームがすでに送信されているかどうかを識別する値を PHP セッションに保存する必要があります$_SESSION。各リクエストが実行されている間、PHP セッションはロックされるため、最初の送信でロックされると、2 番目の送信は最初の送信が終了して値が設定されるまで待機する必要があります。2 番目のリクエストはその後それを読み取り、値が送信済みに設定されているときにブレークします。

これを行う方法の例を次に示します。1 人のユーザーが一度に複数の登録を行っている場合、おそらくバグが組み込まれる可能性があります (なぜそうすべきなのでしょうか?)。

フォームの送信ボタンを含むページで、マーカーを設定する必要があります。

session_start();
$_SESSION["RegistrationSubmitted"] = false;

これは、ユーザーが現在行っている登録がまだ送信されていないことを示しています。

送信 (POST) されているページで、この値を確認できます。

session_start();
if (isset($_SESSION["RegistrationSubmitted"]) {
    if ($_SESSION["RegistrationSubmitted"] == true) {
         die("Registration has already been submitted!");
    } else {
         // Process registration here
         $_SESSION["RegistrationSubmitted"] == true;
    }
} else {
    die("Last registration page hasn't been reached! (A bot?)");
}
于 2012-05-11T15:12:36.000 に答える
3

この状況では、少し JavaScript をお勧めします。送信ボタンに以下を追加します。

onclick="this.disabled=true;"

これにより、ボタンがクリックされると無効になり、再度クリックできなくなります。

于 2012-05-11T15:11:52.133 に答える
1
于 2012-05-11T15:18:19.287 に答える
0

次のようなフォーム キーを作成できます。

<input type="hidden" name="form-key" value="<?php echo $last_order_datetime; ?>" />

次に、新しい注文が送信されたら、$_POST['form-key'] の値が保存されている最新の注文と正確に等しいかどうかを確認します。

存在する場合は、フォームを処理します。それ以外の場合は、再送信またはその他の試行です。

于 2012-05-11T15:14:40.593 に答える