ホームページ >PHPフレームワーク >ThinkPHP >フォームの繰り返し送信を防ぐための Thinkphp のヒント
開発中、フォームの追加や変更を行った場合、バックグラウンドでデータベースの操作が完了した後、他のページにジャンプしたり、このページに戻らないように設定しておりますが、その際はブラウザの「戻る」ボタンをクリックしてから行ってください。ページを送信または更新すると、フォームが繰り返し送信されます。つまり、このレコードは 2 回追加または変更されます。
フォームが繰り返し送信される理由は、初めて送信されたフォームが、次回またはページが送信されるまでメモリにキャッシュされるためです。閉じられるか、他のページにリダイレクトされます。セルフコールが戻ったとき、メモリ内のデータはまだそこにありますが、この時点では、ページ内のサブミットされたコードはまだサブミットされた値を検出できるため、繰り返しサブミットの影響が生じます。
次の方法を使用して解決できます:
方法 1: 最も単純: ページが送信された後、このページではなく別のページに移動します。ページ アドレスは
http://yourdomain.com/User/Index/login
です。この場合、ページのフォーム アクション アドレスは、
<form action="{:U('User/Index/check_login')}" method="post">
などの別の処理アドレスにすることができます。このようにエラーが返されるか、ユーザーが [戻る] ボタンをクリックしても、前のアドレスに戻りますが、これも安全な状況ではありません。より安全にするために、方法 2 も組み合わせる必要があります。
方法 2: フォームを送信すると、送信ボタンが灰色に変わります/送信ボタンが非表示になります
この方法は、通常、方法 1 と組み合わせられます。これは JS を通じて行われます。ユーザーのクリック アクションを動的に監視し、ボタン属性を動的に無効に設定します。これは、ボタンが灰色で使用できないことを意味します。コードは次のとおりです。
HTML:
<form action="{:U('User/Index/check_login')}" method="post">
JS:
$().ready(function(){ $("#login_btn").on('click',function(){ $(this).attr('disabled',true); }); });
方法 1 方法 2 結合すると、基本的に繰り返し提出される問題の 90% 以上が解決されます。しかし、Da Liu これが 3 番目の方法です。これは、サーバー側でこの問題を一度に解決することです。
方法 3: ランダムな TOKEN 値を非表示にする方法を使用して、送信判定を繰り返します。
まず、プロジェクト内のfunctions.php
//创建TOKEN function createToken() { $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) .chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)); session('TOKEN', authcode($code)); } //判断TOKEN function checkToken($token) { if ($token == session('TOKEN')) { session('TOKEN', NULL); return TRUE; } else { return FALSE; } } /* 加密TOKEN */ function authcode($str) { $key = "YOURKEY"; $str = substr(md5($str), 8, 10); return md5($key . $str); }
に以下のメソッドを追加しますフォームページのform
HTML:
<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />##に以下のHTMLコードを記入します。 #ページが表示される前に creatToken() メソッドを呼び出してトークンを生成し、対応するコントローラーの POST リクエストで checkToken() を使用して、繰り返し送信するかどうかを決定します
if(IS_POST) { $post_token = I('post.TOKEN'); if(!checkToken($post_token)){ $this->error('请不要重复提交页面',U('User/Index/login')); } }基本的に、これら 3 つのメソッドを一緒に使用して、 ThinkPHP 開発におけるフォームの繰り返し送信の問題を解決します もちろん一部の学生は ThinkPHP のトークンリング機構を使用できると言われていますが、実際にはその方が簡単です TP はデフォルトでフォームに隠しフィールドを生成します そのとき、隠しフィールドが存在するかどうか、セッション内の値と一致するかどうかを判定することができ、原理は同じで、方法3も同様です。 推奨チュートリアル:
以上がフォームの繰り返し送信を防ぐための Thinkphp のヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。