ホームページ  >  記事  >  バックエンド開発  >  フォームの重複送信を防止するための ThinkPHP のメソッドの例を分析する

フォームの重複送信を防止するための ThinkPHP のメソッドの例を分析する

coldplay.xixi
coldplay.xixi転載
2020-08-14 17:02:272724ブラウズ

フォームの重複送信を防止するための ThinkPHP のメソッドの例を分析する

この記事では、フォームの繰り返し送信を防ぐ ThinkPHP の方法を要約し、分析します。詳細は次のとおりです:

なぜ重複したフォームがありますか?

開発中に、新しいフォームが存在する場合、または 変更したフォームでは、バックグラウンドでデータベースの操作が完了した後、他のページにジャンプするか、このページに戻るかを設定します。このとき、送信またはページを更新する前にブラウザの戻るボタンをクリックすると、フォームのフォームが表示されます。繰り返し送信される、つまり、このレコードは 2 回追加または変更されます。

フォームが繰り返し送信される原因は、初めて送信されたフォームがメモリにキャッシュされ、次にページが送信されるか、ページが閉じられるかリダイレクトされるまで消えないためです。他のページへ。セルフコールが戻ったとき、メモリ内のデータはまだそこにありますが、この時点では、ページ内のサブミットされたコードはまだサブミットされた値を検出できるため、繰り返しサブミットの影響が生じます。

関連する学習の推奨事項: php プログラミング (ビデオ)

これを解決するにはどうすればよいですか?

オンライン ソリューションと独自のテストを要約するには、次の方法を使用できます。

方法 1: 最も簡単: page このページの代わりに別のページに移動します。たとえば、ページ アドレスが

https://www.php.cn/

の場合、ページのフォーム アクション アドレスは次のようになります。別の処理アドレスの場合、

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">

のようなエラーが返されるか、ユーザーが戻るボタンをクリックすると、前のアドレスに戻りますが、この状況は安全ではありません。より安全にするために、方法 2 も一致させる必要があります。

方法 2:フォームを送信すると、送信ボタンが灰色に変わり、送信ボタンが非表示になります

この方法これは通常、方法 1 と組み合わせられます。実行することは、JS を使用してユーザーのクリック アクションを動的に監視し、ボタン属性を動的に無効に設定することです。これは、ボタンが灰色で使用できないことを意味します。コードは次のとおりです。

HTML:

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
  
  
  

JS:

$().ready(function(){
   $("#login_btn").on(&#39;click&#39;,function(){
      $(this).attr(&#39;disabled&#39;,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(&#39;TOKEN&#39;, authcode($code));
}
//判断TOKEN
function checkToken($token) {
  if ($token == session(&#39;TOKEN&#39;)) {
    session(&#39;TOKEN&#39;, 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(&#39;TOKEN&#39;)}" />

ページが表示される前に creatToken() メソッドを呼び出してトークンを生成し、対応するメソッドで checkToken() を使用します。コントローラの POST リクエストで再送信するかどうかを決定する

if(IS_POST)
{
$post_token = I(&#39;post.TOKEN&#39;);
 if(!checkToken($post_token)){
   $this->error(&#39;请不要重复提交页面&#39;,U(&#39;User/Index/login&#39;));
 }
}

基本的に、これら 3 つの方法を一緒に使用して、ThinkPHP 開発におけるフォームの繰り返し送信の問題を解決できます。もちろん、一部の学生は、ThinkPHP のトークン リング メカニズムを使用できると言いました, これは実際にはもっと簡単です。TP はデフォルトでフォームに隠しフォームを生成します。ドメイン, その後、この隠しドメインが存在するかどうか、およびセッション内の値と一致するかどうかを判断できます。原理は方法 3 と同じです。

PS: 今日、ついに Jianshu のマークダウン エディターを使用してコンテンツを投稿しました。案の定、マークダウン構文はカバーされておらず、全体のレイアウトは新しく、悪くありませんでした。

関連する学習に関する推奨事項: プログラミング ビデオ

以上がフォームの重複送信を防止するための ThinkPHP のメソッドの例を分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。