場合によっては、プログラムの実行が遅くなり、ページがあまりフレンドリーではなく、プロンプト情報が表示されないことがあります。オペレータは、送信ボタンがクリックされていないと考えた場合、再度送信ボタンをクリックします。これは多くの問題を引き起こす可能性があります。重複投稿を防ぐ3つの方法をご紹介します。
1. 送信ボタンが無効になっています
ユーザーが送信すると、ボタンはすぐに無効になります。これはjsを使って実装されています。
送信する前に
$("#submit").attr('disabled','true');
$("#submit").val("送信中です、お待ちください");
................................................................................... ...................................
実行後、ボタンを元の状態に戻します
$('#submit ').removeAttr('disabled');
$("#submit ").val("送信の確認");
2. 有効期限の方法
アイデア: ユーザーがボタンを送信すると、トークンが生成され (トークンはビジネス送信ごとに一意の値です)、セッションに保存され、有効期限が設定されます。ユーザーが再度送信するときに、トークンが一貫していて期限切れであるかどうかを確認します。一貫性があり、期限切れになっていない場合は、2 回送信されたとみなされます。プログラムの実行中にエラーが発生した場合、セッションに保存されている値をクリアする必要があります。手順は以下をご覧ください
関数 checkRepeatSubmit($uniqueid = '', $expire = 30) {
$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()-> ;user->mihome : $uniqueid;
$token = md5("wms_check_repeat" . $uniqueid);
$time = time();
if (isset($_SESSION['token']) && !empty($_SESSION['token']) && $_SESSION['token'] == $token && ($time - $_SESSION['expire_time' ] < $期限切れ)) {
false を返します;
} else {
$_SESSION['token'] = $token;
$_SESSION['expire_time'] = $time;
// セッション 書き込み時にページ全体がロードされるまで待機します。この関数を使用して
をすぐに書き込みます。session_write_close();
true を返します;
}
}
//保存された値を削除します
関数 cancelRepeatSubmit() {
unset($_SESSION['token']);
unset($_SESSION['expire_time']);
}
3. トークンの破棄方法
アイデア: ページが追加されると、トークンが生成され、セッションに保存され、フォームに書き込まれます。フォームが送信されると、サーバーはセッションに保存されているトークンとトークンを比較し、ページが送信されると、セッションに保存されているトークンが破棄されます。 2 回目では、セッションに保存されているトークンが破棄され、トークンが存在しないため、エラーが報告されます。以下はコードです
/**
* 2 番目のオプション
* 1. トークンを生成し、セッションに保存します
* 2. ページ
で生成します* 3. 送信されたページとセッションを比較し、成功後にセッションを破棄します
* 4. 2 回目の送信では、この値は存在せず、エラーが報告されます
* @param type $uniqueid
* @return type
*/
関数 createToken($uniqueid) {
$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()-> ;user->mihome : $uniqueid;
$token = md5("wms_check2_repeat" . $uniqueid);
$_SESSION['form_token'] = $token;
session_write_close();
$token を返す;
}
関数 checkToken($token) {
if (!isset($_SESSION['form_token']) empty($_SESSION['form_token']) $_SESSION['form_token'] != $token) {
false を返します;
} else {
true を返します;
}
}
上記に 3 つの方法をまとめましたが、個人的には 1 つ目と 2 つ目の方法を併用するとより良い結果が得られると感じています。 2 番目の方法と 3 番目の方法 個人的には、3 番目の方法に利点があると感じます。
2 番目と 3 番目のメソッドはどちらもセッション内にトークンを書き込みます。このメソッドの利点はストレージ領域を節約できることですが、欠点は、セッションが書き込む前にページ全体をロードする必要があることです。ページ全体が読み込まれても、処理が遅く、ユーザーが送信を複数回クリックしても、セッションがまだ書き込まれていないため、システムはこれが最初の入力であると認識する可能性があります。検証が機能しなくなります。幸いなことに、php 関数は素晴らしい機能を提供します。 session_write_close() を使用すると、ページのロードを待たずにすぐにセッションを書き込むことができます。同僚には、redis、memcache、データベースなど、セッションを保存するための多くのオプションもあります。