フォームの繰り返し送信を解決して回避するための PHP メソッド

WBOY
リリース: 2016-08-08 09:26:06
オリジナル
1252 人が閲覧しました

転載元: http://www.hlmblog.com/183.html

フォームを送信する際、ネットワーク速度などの影響でページの読み込みが突然遅くなる場合があります。ユーザーが送信ボタンを繰り返しクリックすると、多くのエラーが発生します。データベース内で生成され、制御不能な状況につながります。

たとえば、次の状況ではフォームが繰り返し送信されます:
送信ボタンを 2 回クリックします。
更新ボタンをクリックします。
ブラウザの戻るボタンを使用して前の操作を繰り返すと、フォームが繰り返し送信されます。
ブラウザ履歴を使用してフォームを繰り返し送信します。
ブラウザからの重複した HTTP リクエスト。
ウェブページが悪意を持って更新されました。

ここにいくつかの解決策があります:
1: js を使用して、クリック後にボタンが灰色になるように設定します

$(document).ready(function(){
  $(input:submit).click(){
      setTimeout(function(){obj.disabled=true;},100)
  };
});
ログイン後にコピー

2: セッションを使用します

セッション (フォームがリクエストされたときに生成されるマーク) は、フォーム。

このメソッドを使用して、フォーム データを受信した後にフラグ値が存在するかどうかを確認し、最初にフラグ値を削除してからデータを処理します。存在しない場合は送信されたことを意味し、この送信は無視されます。


//服务端生成随机数存入session, 分配至表单页
$data['sess_id'] = $_SESSION['sid'] = mt_rand(1000, 9999);
$this->load->view('form', $data);

//表单页隐藏域存放此session值
<input type="hidden" name="sid" value="<?=$sess_id; ?>">

//处理
if($_POST['sid'] != '' && $_POST['sid'] == $_SESSION['sid'])
{
 unset($_SESSION['sid']);

 echo '处理数据';
}
else
{
 echo '已提交过表单';
}
ログイン後にコピー


3: Cookieを使用する

原理はセッションと同様ですが、ユーザーのブラウザがCookieを無効にすると、この機能は無効になります


if(isset($_POST['submit'])){
    setcookie("tempcookie","",time()+30);  
    header("Location:".$_SERVER[PHP_SELF]);exit();  
}
if(isset($_COOKIE["tempcookie"])){  
    setcookie("tempcookie","",0);echo "您已经提交过表单";  
}
ログイン後にコピー

4: ヘッダー関数を使用してジャンプ

一度ユーザーが送信ボタンをクリックし、処理します。 データが完了したら、他のページに移動します
if (isset($_POST['submit'])) {
   header('location:success.php');//处理数据后,转向到其他页面
}
ログイン後にコピー

5: データベースを使用して制約を追加します


ユーザーが繰り返し送信していることが判明したら、データベースに一意の制約を追加するか、一意のインデックスを直接作成します。 、警告またはプロンプトが直接スローされます

、または単に処理することもできます。これは、初めてデータを送信する場合に最も直接的で効果的な方法です。初期のデータベース設計とアーキテクチャについて慎重に検討する必要があります

以上、フォームの繰り返し送信を回避するためのPHPメソッドを内容も含めて紹介しましたので、PHPチュートリアルに興味のある友人の参考になれば幸いです。

🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート