Post/Redirect/Get パターンの実装に問題がある
-
16-09-2019 - |
質問
私がいつも使っているのは、 投稿/リダイレクト/取得 私のフォームのメソッド。私のフォームは通常、常に自分自身に送信されます。ただし、フォームにエラーがある場合は、新しいヘッダーは送信しません。これは、このようなことを簡単に行うことができるようにするためです
<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />
PHP は、$_POST キーとデフォルト値 (存在しない場合) の 2 つの引数を処理する単なるライブラリ関数です。
つまり、フォームに間違いを犯した場合でも、再度フォームに記入する必要はありません。欠点は、ページをリロードするとブラウザに POST 警告が表示されることです。
とにかく、状態に何かを使用せずにこれを回避する方法はありますか(つまり、Cookie、セッション、データベースなど)
解決
私はこれを行うための最善の方法は、ヘッダの機能を使用している見つけます。あなたは今まであなたはそれが失敗した場合、フォームに戻るために、ヘッダーのリダイレクトを使用していても、それ自体必要その後、検証を行うファイルの内容に投稿することができます。したがって、あなたが以前に入力されたデータにアクセスすることができ、セッション中post'd値または別のアクセス可能の変数を格納します。
ヘッダ使用する場合( "位置:myscript.phpを"); exit()を含めるようにしてください。その後そうでなければ、まだリフレッシュにPOSTの警告が表示されます。
myscript.php
if($_POST['submit'])
{
//check for errrors
if ($error)
{
$_SESSION['myPostVars'] = $_POST;
header("location: myscript.php");
exit();
}
}
<form>
// your form code
</form>
編集:私はちょうどあなたがセッションを使用しないようにあなたの質問を編集したことに気づいた。
あなたがポストを直列化可能性は、あなたが戻って、ヘッダを経由して送信されたクエリ文字列(に入れたいvarsは()
他のヒント
セッションに状態を保存しない限り、これを回避する方法はありません。エラーが発生した場合は、おそらく次のようなことを行うことができます。
- 一意のIDを生成する
- をコピーする
$_POST
上記の一意の ID をキーとして変数をセッションに挿入します - 現在と同様にリダイレクトしますが、クエリ文字列の一部として一意の ID を渡します。
- にアクセスする代わりに、セッション (エラー状況) でこの一意の ID を探すようにライブラリを更新します。
$_POST
変数を直接使用します。一意の ID がリクエストで渡されなかった場合、または探している名前が存在しない場合は、デフォルト値を使用します。 - リクエストの最後に、セッションから一意の ID エントリを削除します。これにより、セッションが大量のゴミで汚染されることがなくなります。ライブラリによっては、リクエストの最初にこれを行うこともできます
私はあなたがこのような何かを意味すると思います
function Value($array, $key, $default = false)
{
if (is_array($array) === true)
{
settype($key, 'array');
foreach ($key as $value)
{
if (array_key_exists($value, $array) === false)
{
return $default;
}
$array = $array[$value];
}
return htmlspecialchars($array);
}
return $default;
}
<input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />
また、<のhref = "http://www.ajaxray.com/blog/2008/01/12/how-to-avoid-postdata-resend-warning/" のrel = "nofollowをnoreferrer" にしたいこと>このチュートリアルに読みます。
あなたは基本的に右のそれをやっています。 「再投稿」の警告を避けるための良い方法は何も特にありません。