ホームページ >バックエンド開発 >PHPチュートリアル >フォームの繰り返し送信を防ぐ方法に関する ThinkPHP のヒント
://www.php.cn/php/php-tp-append.html" target="_blank"> が追加または変更された場合、m フォームが繰り返し送信されます。 フォームが繰り返し送信される理由は、次回ページが送信されるか、ページが閉じるか他のページにリダイレクトされるまで、最初に送信されたフォームがメモリにキャッシュされるためです。自己呼び出しが返されますが、メモリ内のデータはまだ存在します。この時点でも、ページ内の送信コードは送信された値を検出できます。
方法 1http://yourdomain.com/User/Index/login
です。その場合、ページのフォーム
action アドレスは次のようになります。エラーを返す <form action="{:U('User/Index/check_login')}" method="post">
などの別の処理アドレス、またはユーザーが戻るボタン
属性 を動的に設定しますコードは次のとおりです:
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); }フォームページのformに次のHTMLコードを入力します
HTML:
<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />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 サイトの他の関連記事を参照してください。