この記事では、フォームの重複送信を防止するための ThinkPHP の方法を主に紹介し、フォームの重複送信を防止するための 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% 以上は解決できますが、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); }
<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />
の送信を繰り返すかどうかを決定する
if(IS_POST) { $post_token = I('post.TOKEN'); if(!checkToken($post_token)){ $this->error('请不要重复提交页面',U('User/Index/login')); } }
creatToken()
方法生成token,在相应控制器POST请求中 使用 checkToken()
追記:
今日、ついに Jianshu のマークダウン エディターを使用してコンテンツを投稿しました。案の定、マークダウン構文はカバーされておらず、全体のレイアウトは新しく、悪くありませんでした。 関連する推奨事項:PHP は、フォームの繰り返し送信を防止する機能を実装します (トークン検証に基づいて)
以上がフォームの繰り返し送信を防ぐ ThinkPHP メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。