上記を行う方法はありますか?基本的に、フォームを一度送信した後で誰かが更新を押した場合に、フォームを再度送信したくない。その場合、ブラウザから尋ねられますが、フォームを再度送信しますか?この場合、unset($_POST['username'])
は役に立ちますか?
一部の投稿者がすでに言及しているように、post/redirect/getは良いオプションです。
私が考えるもう1つの方法は、dostuff.phpページにセッションを設定して、投稿がすでに行われたことを示すことです。毎回このセッション変数をチェックして、ページが更新されたためにページが再度ロードされているかどうかを確認してください。
<?php
session_start();
if(isset($_SESSION['indicator']))
{
/*
dont do anything because session indicator says
that the processing was already done..
you might want to redirect to a new url here..
*/
}
else
{
/*
first set session indicator so that subsequent
process requests will be ignored
*/
$_SESSION['indicator'] = "processed";
//process the request here..
}
?>
リダイレクト先のページで、セッション変数を設定解除して、フォームをもう一度再送信して、新しい投稿操作にすることができるようにします。これにより、新しいフォーム投稿が許可されますが、ページの更新により投稿操作ができなくなります
中間ページを使用して操作を行い、リダイレクトします。
例えば:
mypage.php->フォームのあるページ
dostuff.php->フォームデータを受信して操作を行い、他のページにリダイレクトします。
リダイレクトを行うには:
「dostuff.php」の先頭に次の行を追加します:header("Location: mypage.php");
このコードを使用
if(isset($_POST)){
header('location:'.$_SERVER['PHP_SELF']);
die();
}
上で直面している問題は、具体的には Post/Redirect/Get で解決できます(そして解決する必要があります)。設定解除_POST
問題は別のリクエストであるため、php側では効果がありません。
また、送信ボタンのダブルクリックにも対処する必要があります。これは、ボタンをクリックした後のフォーム送信を無効にするか、ランダムなトークンをフォームに配置してセッションに保存することで、クライアント側で解決できます。トークンは1回だけ受け入れられます(セッションは、トークンが投稿されたかどうかを追跡します)。
これは、ユーザーが同じデータを2回送信しないようにするために使用する素晴らしい方法です。これにより、リロード時にページがデータベースに同じレコードを追加することも防止されます。
// First IF
if ($_SESSION['dup_comment_body'] == $_POST['comment_body']) {
echo 'You already entered that.';
} else {
// Second IF
if ($_POST['comment_body']) {
// Run your query here
$_SESSION['dup_comment_body'] = $_POST['comment_body'];
header('location:'.$_SERVER['REQUEST_URI'].'');
}
}
最初のIF
は、$_POST
が最後に入力したもの($_SESSION
)と等しいかどうかを確認します。同じでない場合は、次のIF
を実行して、$_POST
変数が空でないかどうかをテストします。最後のIF
の下部に向かって、$_SESSION['dup_comment_body']
が$_POST
と等しくなるように設定します。したがって、次に最初のIF
が実行され、$_POST
が同じである場合、「あなたはすでに入力しました」というメッセージが表示されます。お役に立てれば!
フォームがデータベースを更新する場合、レコードが存在しない場合にのみ更新または挿入できます。最初にselectステートメントを実行するだけです。これにより、更新による重複レコードが防止されます。
これには POST/REDIRECT/GETパターン を使用する必要があります。
Post/Redirect/Get(PRG)は、フォーム送信の重複を防ぎ、ユーザーエージェント(ユーザー)により直感的なインターフェイスを作成するWeb開発設計パターンです。 PRGは、重複するフォーム送信を作成しない予測可能な方法でブックマークと更新ボタンをサポートします。
WebフォームがHTTP POSTリクエストを介してサーバーに送信されると、特定のユーザーエージェントでサーバーの応答を更新しようとするWebユーザーが、元のPOSTリクエストが再送信されるため、Web購入の重複など、望ましくない結果が発生する可能性があります。
この問題を回避するために、多くのWeb開発者はPRGパターンを使用します。Webページを直接返すのではなく、POST操作はリダイレクトコマンドを返します。HTTP1.1仕様では、HTTP 303(「他の")応答コードを使用して、この状況でWebユーザーのブラウザーが最初のPOST要求を再送信することなくサーバー応答を安全に更新できるようにします。ただし、今日使用されている最も一般的な商用アプリケーション(新しい古いものも同様)これらの状況でも引き続きHTTP 302( "Found")応答を発行します。
PHPの例を次に示します。
header('Location: /yourpage.php', true, 303);
exit;