ホームページ >バックエンド開発 >PHPチュートリアル >フォームの重複送信を防止するための ThinkPHP のメソッドの例を分析する
この記事では、フォームの繰り返し送信を防ぐ ThinkPHP の方法を要約し、分析します。詳細は次のとおりです:
なぜ重複したフォームがありますか?
開発中に、新しいフォームが存在する場合、または 変更したフォームでは、バックグラウンドでデータベースの操作が完了した後、他のページにジャンプするか、このページに戻るかを設定します。このとき、送信またはページを更新する前にブラウザの戻るボタンをクリックすると、フォームのフォームが表示されます。繰り返し送信される、つまり、このレコードは 2 回追加または変更されます。
フォームが繰り返し送信される原因は、初めて送信されたフォームがメモリにキャッシュされ、次にページが送信されるか、ページが閉じられるかリダイレクトされるまで消えないためです。他のページへ。セルフコールが戻ったとき、メモリ内のデータはまだそこにありますが、この時点では、ページ内のサブミットされたコードはまだサブミットされた値を検出できるため、繰り返しサブミットの影響が生じます。
関連する学習の推奨事項: php プログラミング (ビデオ)
これを解決するにはどうすればよいですか?
オンライン ソリューションと独自のテストを要約するには、次の方法を使用できます。
方法 1: 最も簡単: page このページの代わりに別のページに移動します。たとえば、ページ アドレスが
https://www.php.cn/
の場合、ページのフォーム アクション アドレスは次のようになります。別の処理アドレスの場合、
<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); }
フォームページのフォームに以下のHTMLコードを記入します
HTML:
<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />
ページが表示される前に creatToken()
メソッドを呼び出してトークンを生成し、対応するメソッドで checkToken()
を使用します。コントローラの POST リクエストで再送信するかどうかを決定する
if(IS_POST) { $post_token = I('post.TOKEN'); if(!checkToken($post_token)){ $this->error('请不要重复提交页面',U('User/Index/login')); } }
基本的に、これら 3 つの方法を一緒に使用して、ThinkPHP 開発におけるフォームの繰り返し送信の問題を解決できます。もちろん、一部の学生は、ThinkPHP のトークン リング メカニズムを使用できると言いました, これは実際にはもっと簡単です。TP はデフォルトでフォームに隠しフォームを生成します。ドメイン, その後、この隠しドメインが存在するかどうか、およびセッション内の値と一致するかどうかを判断できます。原理は方法 3 と同じです。
PS: 今日、ついに Jianshu のマークダウン エディターを使用してコンテンツを投稿しました。案の定、マークダウン構文はカバーされておらず、全体のレイアウトは新しく、悪くありませんでした。
関連する学習に関する推奨事項: プログラミング ビデオ
以上がフォームの重複送信を防止するための ThinkPHP のメソッドの例を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。