ホームページ  >  記事  >  バックエンド開発  >  フォームの重複送信を防ぐ ThinkPHP の方法 サンプル分析 php サンプル

フォームの重複送信を防ぐ ThinkPHP の方法 サンプル分析 php サンプル

jacklove
jackloveオリジナル
2018-06-25 17:54:531654ブラウズ

この記事では、ThinkPHP のフォームの重複送信を防止するための方法を主に紹介しており、フォームの重複送信を防止するための thinkPHP のさまざまな一般的な操作テクニックと関連する注意事項を例として紹介します。

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

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

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

フォームが繰り返し送信される原因は、初めて送信されたフォームがメモリにキャッシュされ、次にページが送信されるか、ページが閉じられるかリダイレクトされるまで消えないためです。他のページへ。自己呼び出しが返されるとき、メモリ内のデータはまだ存在しており、この時点でページ内の送信されたコードは送信された値を検出できるため、繰り返し送信されることになります。 ############の解き方?

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

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

http://yourdomain.com/User/Index/login です。ページのフォーム アクション アドレスは、

780f4b3c36ad706762deaa6d9e27b237

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

方法 2:

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

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

HTML:

<form action="{:U(&#39;User/Index/check_login&#39;)}" method="post">
  <input type="text" name="username" value="" id="username" />
  <input type="password" name="userpwd" id="userpwd" />
  <input type="submit" name="login_btn" id="login_btn" value="登陆"/>
</form>

JS:

$().ready(function(){
   $("#login_btn").on(&#39;click&#39;,function(){
      $(this).attr(&#39;disabled&#39;,true);
   });
});

方法 1 方法 2 結合後、基本的に、繰り返し送信される問題の 90% 以上は解決できますが、Da Liu はまだ 3 番目の方法について話したいと考えています。これは、この問題をサーバー側で完全に解決することです。

方法 3:

ランダムな

TOKEN

値を非表示にする方法を使用して、繰り返しの送信を決定する

まず、次のメソッドをプロジェクトのfunction.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 コードを入力します。form

HTML:

568115841160b81a8386efa13ad3ccf5

ページが表示される前に、

creatToken()

メソッドを呼び出してトークンを生成し、対応するコントローラー POST で

checkToken()

を使用します。再送信するかどうかを決定するためのリクエスト

<pre class="brush:php;toolbar:false;">if(IS_POST) { $post_token = I(&amp;#39;post.TOKEN&amp;#39;); if(!checkToken($post_token)){ $this-&gt;error(&amp;#39;请不要重复提交页面&amp;#39;,U(&amp;#39;User/Index/login&amp;#39;)); } }</pre> 基本的に、これら 3 つの方法を組み合わせて使用​​すると、ThinkPHP 開発におけるフォームの繰り返し送信の問題を解決できます。学生たちは、ThinkPHP のトークン リング メカニズムを使用できると言いました。実際には、その方が簡単です。TP はデフォルトでフォームに隠しフィールドを生成します。その際、隠しフィールドが存在するかどうか、およびそれがフィールド内の値と一致するかどうかを判断できます。原理は方法3と同じです。

追記:

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

#興味があるかもしれない記事:

PHP ページング表示メソッドの分析 [PHP の一般的なページング クラスの php ヒントが添付されています

画像サイズを圧縮してjpg形式に変換するPHPメソッドの例_phpスキル


PDO抽象化レイヤーを使用してクエリ結果を取得するPHPメソッドの例phpスキル










##

以上がフォームの重複送信を防ぐ ThinkPHP の方法 サンプル分析 php サンプルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。