** 背景: Bruce (sqlwork.com) の優れた説明に感謝します。
この Web ページを正しく表示するには、以前に入力したデータが必要です。このデータを再度送信することはできますが、送信すると、このページで以前に実行したアクションが繰り返されます。Reload を押すと、そのデータが再送信され、このページが表示されます。
Web 開発者のずさんなコーディング慣行のため、ブラウザはこのメッセージを追加せざるを得ませんでした。シナリオは次のとおりです。
1) ユーザーがフォームに入力して送信 (フォームを投稿) 2) サーバーが投稿データを処理し、キャッシュ不可としてマークされた新しいページ (確認) で応答 3) ユーザーが新しいページに移動。4) ユーザーが押し戻す:
ブラウザーがステップ 2 でページを表示するには、キャッシュなしとマークされているため、サーバーから要求する必要があります。つまり、データの再投稿を行います (ステップ 1 を実行します)。これがずさんなコーディングが入ってきた場合です。これがクレジットカードの請求であり、再投稿の検出がサーバー上になかった場合、カードは2回請求されます. これは非常に一般的な問題であり、ブラウザはこれを検出してユーザーに警告する必要がありました。
最善の修正はステップ 2 で、サーバーは確認ページにリダイレクトを送信します。その後、ユーザーが履歴またはバックを介して確認にアクセスすると、投稿リクエストではなく取得リクエストであり、警告は表示されません。
注: Web フォームのポストバック モデルは、この問題に役立ちます。また、サーバー転送を回避します。
私の解決策
$_SESSION['home'] は、ホームページのエラーを保存するために使用されます。
$_SESSION['tempEmail'] は、php フォームで値をエコーするために使用されます。
注: エラー処理用の HTML フォームを含むページごとに一意のセッション変数を 1 つ使用し、HTML フォームでエコーされる値ごとに任意のセッション変数を使用します。
<?php
session_start();
//Initialize variables not initialized without overwriting previously set variables.
if(!isset($_SESSION['home'])) {
$_SESSION['home']="";
$_SESSION['tempEmail']="";
}
オプション - ログインしている場合は、電子メール アドレスを $_SESSION['tempEmail'] 変数に割り当てて (まだ行っていない場合)、HTML フォームに事前入力します。
if(isset($_POST['Submit'])){
---your code---
//Error message(s) examples
$_SESSION['home'] = "Email and Password do not match, please try again.";
header("Location: " . $_SERVER['REQUEST_URI']);
$_SESSION['home'] = "Email address format is invalid. Please recheck.";
header("Location: " . $_SERVER['REQUEST_URI']);
//success
unset ($_SESSION['home']); //optional, unset to clear form values.
header ("location: nextpage.php");
---or---
header("Location: " . $_SERVER['REQUEST_URI']); //re-post to same page with the $_SESSION['home'] success message.
}
?>
<body>
エラーボックス
<span><strong class="error"><?php echo $_SESSION['home'] ?></strong></span>
HTMLフォーム
<form action="#" name="loginform" method="post" >
<input type="text" name="userEmail" maxlength="50" title="Enter Your email" autocomplete="off" value="<?php echo htmlspecialchars($_SESSION['tempEmail']); ?>" placeholder="enter email" required/>
<input type="submit" name="Submit" value="Submit">
</form>
</body>
支払いページでの使用は推奨されません。上記の説明を参照してください。Firefox、Chrome、Safari、IE9 でテスト済み。戻るボタンを使用すると、迷惑なメッセージがなくなりました。ヘッダー警告を回避するために、php スクリプトまたは php.ini で出力バッファリングが「オン」になっていることを確認してください。php.ini ファイルで次のことを確認できます。
output_buffering=On