2

私のページが投稿を行うとき、すべての$_POSTデータを別の$_SESSIONvar に保存します。この同じページへの戻るボタンは、Document Expiredメッセージを表示するように設計されていることを知っています。私の望みは、ブラウザを欺いて、実際には$_POSTデータがまったくなかったと考えさせ、ブラウザにDocument Expired戻ったときにメッセージを表示しないようにすることです。ページの完全な更新を強制しているので、セッションに保存されているため、古いデータを受け取る心配はありません。

unset($_POST)これがページにとどまることを願っています。ただし、$_POSTデータはキャッシュ/保存する必要があり、更新または戻るボタンで戻ります。私がやろうとしていることは可能ですか?何か案は?

*更新* 私の解決策/回答は以下に掲載されています。別のフォームに投稿すると、処理のために元のフォームにリダイレクトされます。反対票を投じる理由がわかりません。何ヶ月もうまく機能しており、ドキュメントの期限切れメッセージを受信しなくなりました. 重複投稿も防げます。

4

4 に答える 4

4

これは、post - redirect - get デザイン パターンを使用して実現できます。
http://en.wikipedia.org/wiki/Post/Redirect/Get

このパターンを実装するより標準的な方法は、フォームを 1 つのページに表示、検証、および保存することです。

次のソリューションには、次の利点があります
。 1. フォームに関連するすべてのコードが 1 か所にあります。2. サーバー側の検証は簡単です

form.php と after.php の 2 つのページがあります。

form.php :

if(isPosted()){
    if(dataIsValid($postedData)){ 
// dataIsValid should set $message to show to the user
        saveData($postedData);
        redirect('after.php');
        die();
    }
} else {
    $postedData = $defaultValues;
}
showForm($postedData, $message);
于 2013-10-04T18:28:59.940 に答える
2

この問題を解決するには、スクリプトの先頭に次を追加します。

header("Cache-Control: max-age=300, must-revalidate");
于 2014-04-08T05:20:32.763 に答える
0

頭に浮かぶ最も簡単な解決策は?投稿を直接行うのではなく、イベントをキャッチし、AJAX を介してフォームを送信します。次に、成功したらリダイレクトします。

jQuery を使用した例:

$('#some_form').submit(function() {
    $.post($(this).attr('action'), $(this).serialize(), function() {
       window.location = "/some/success/url.php";
    });
    return false; // Prevent the form submission & any other events triggered on submit
});

POST はブラウザーの履歴に追加されないため、この問題は発生しません。

ただし、POST URL はロードしたものとは異なることに注意してください。POST または GET がサーバー側で行われたかどうかを確認することで同じにすることができますが、いずれにしても、POST の結果を「記憶」するために少し余分な作業を行う必要があります。

于 2013-10-04T18:38:34.167 に答える