ユーザーがフォームを送信すると、ネットワーク速度の関係で同じレコードが繰り返しデータベースに挿入されたり、Web ページが悪意を持って更新されたりする可能性があり、これは比較的厄介な問題です。同じフォームを繰り返し送信することを避けるために、クライアント側とサーバー側から同時に開始することができます。
クライアント側スクリプトに関しては、一般的な入力検証に JavaScript がよく使用されます。以下の例では、フォームの繰り返しの送信を処理するために使用しています。以下のコードを参照してください:
上記の例では、OnClick イベントを使用してユーザーの送信ステータスが検出され、「送信」ボタンがクリックされると、ボタンはすぐに無効な状態に設定され、ユーザーはボタンを再度クリックして送信できなくなります。
これも JavaScript の関数を使用する別のメソッドがありますが、フォームが一度送信されると、すぐにダイアログ ボックスが表示されます。コードは次のとおりです。
上記の例では、ユーザーが「送信」ボタンをクリックすると、スクリプトは現在のステータスを自動的に記録し、submitcount 変数を 1 増やします。ユーザーが再度送信しようとすると、スクリプトは submitcount 変数の値が次の値であると判断します。ゼロ以外の場合、フォームの二重送信を避けるためにユーザーに「送信済み」と表示されます。
if(isset($_POST['go'])){
setcookie("tempcookie","",time()+30);
header("場所:".$_SERVER[PHP_SELF])
終了()
}
if(isset($_COOKIE["tempcookie"])){
setcookie("tempcookie","",0);
エコー「あなたはすでにフォームを送信しました」
}
?>
クライアントがCookieを無効にしている場合、このメソッドは効果がありませんので、注意してください。 Cookie の詳細については、第 10 章「PHP セッション管理」を参照してください。
3.セッション処理を使用する
PHP のセッション関数を使用すると、フォームの繰り返しの送信を避けることもできます。セッションはサーバー側に保存され、次回この変数にアクセスすると、セッション変数を使用して送信された値を記録できます。フォームが一致しない場合は、ユーザーが繰り返し送信していると見なされます。次のコードを参照してください:
セッション開始();
//現在のセッションに基づいて乱数を生成します
$code = mt_rand(0,1000000);
$_SESSION['コード'] = $コード
?>
ページフォームの隠し値として乱数を渡します。コードは次のとおりです:
受信ページのPHPコードは以下の通りです:
セッション開始();
if(isset($_POST['originator'])) {
if($_POST['originator'] == $_SESSION['code']){
' を使用します
一緒に、一緒に、一緒に、外に、外に、外に
}その他{
echo 'このページを更新したり、フォームを繰り返し送信しないでください。 』;
}
}
?>
Session の内容については、第 10 章「PHP セッション管理」で詳しく説明します。この章を直接確認してから、このセクションに戻って読み続けることができます。
4.ヘッダー関数を使用してリダイレクトします
上記の方法に加えて、より簡単な方法もあります。つまり、ユーザーがフォームを送信すると、サーバー側でそれを処理し、すぐに他のページにリダイレクトされます。コードは次のとおりです。
if (isset($_POST['action']) && $_POST['action'] == '送信済み') {
//データを挿入し、すぐに他のページにリダイレクトするなど、データを処理します
header('location:submits_success.php');
}
この方法では、ユーザーが更新キーを使用した場合でも、フォームは新しいページにリダイレクトされ、このページ スクリプトは送信されたデータを気にしなくなるため、フォームが繰り返し送信されることはありません。
5.8.4 フォームの有効期限切れの扱い
開発プロセス中に、フォームエラーが発生し、ページに戻ったときに入力されたすべての情報が失われることがよくあります。これは、ページバウンスをサポートするために、次の 2 つの方法で実現できます。
1.ヘッダー ヘッダーを使用して、キャッシュ コントロール ヘッダー Cache-control を設定します。
header('Cache-control: private, must-revalidate'); // ページのバウンスをサポートします
2. session_cache_limiter メソッドを使用します。
session_cache_limiter('private,must-revalidate'); //session_start メソッドの前に記述します
次のコード スニペットにより、ユーザーがフォームに入力して「送信」ボタンをクリックして戻ることができなくなり、フォームに入力したばかりのコンテンツはクリアされません:
session_cache_limiter('nocache');
session_cache_limiter('プライベート');
セッションキャッシュ_リミッター('パブリック');
セッション開始();
//以下はフォームの内容です。ユーザーがフォームに戻っても、入力した内容はクリアされません
このコードを適用するスクリプトの先頭に貼り付けます。
キャッシュ制御メッセージヘッダーフィールドの説明
Cache-Control は、リクエストとレスポンスが続くキャッシュ メカニズムを指定します。要求メッセージまたは応答メッセージで Cache-Control を設定しても、別のメッセージの処理中のキャッシュ プロセスは変更されません。
リクエストのキャッシュ命令には、no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached が含まれます。応答メッセージの命令には、public、private、no-cache、no が含まれます。 -store、no-transform、must-revalidate、proxy-revalidate、および max-age。各メッセージの指示の意味を表 5-3 に示します。
キャッシュ手順
明さんは言いました
公開
応答を任意のキャッシュにキャッシュできることを示します
プライベート
単一ユーザーの応答メッセージ全体または一部を共有キャッシュで処理できないことを示します。これにより、サーバーはユーザーの応答メッセージの一部のみを記述することができ、他のユーザーのリクエストには無効になります
キャッシュなし
リクエストまたはレスポンスメッセージをキャッシュできないことを示します
無店舗
重要な情報が誤って公開されるのを防ぐために使用されます。リクエスト メッセージを送信すると、リクエスト メッセージとレスポンス メッセージの両方でキャッシュが使用されます
最大年齢
クライアントが指定された時間 (秒単位) 以下の有効期間で応答を受信できることを示します
ミニフレッシュ
クライアントが現在時刻に指定された時間を加えた時間よりも短い応答時間で応答を受信できることを示します
最高に古い
クライアントがタイムアウト期間を超えて応答メッセージを受信できることを示します。 max-stale message の値が指定されている場合、クライアントはタイムアウト期間の指定された値を超える応答メッセージを受信できます
セッションと Cookie の概要については、第 10 章「PHP セッション管理」を参照してください。
5.8.5 フォームアクションを判断するためのヒント
同じプログラムで処理すべきアクションをフォームに割り当てることができますが、ユーザーが押したボタンの内容をどのように判断するかは小さな問題です。
実際、必要なのは送信ボタンの名前だけです。フォームが送信されるとき、ボタンの値が存在する限り、押された送信タイプのボタンのみがフォーム配列に送信されます。次の形式を例として、ユーザーがどのボタンを押したかを判断できます。