まず第一に、デフォルトだけを使用しないでください。これは、 (以前は : と呼ばれていた) 応答header("Location...")
を送信するためです。これは、実際の動作について「嘘をつく」ようなものです ( 「要求されたリソースが別の URI の下に一時的に存在する」ことを意味するため)。 )。さらに悪いことに、フォームが使用している場合(ほとんどの場合)、 HTTP 1.1 に従って、準拠しているブラウザーはリダイレクトする前に許可を求める必要さえあります。302 Found
Moved Temporarily
POST
その ため、この目的のために特別に追加された を代わりに使用して、フォーム URI を適切にリセットします。GET
303 See Other
(フォームの送信が成功し201 Created
たことを確認するための応答と組み合わせるのも良いので、結果ページにa を追加するの
も良い方法です。)header("HTTP/2.0 201 Created")
しかし、あなたの古いコメントに対処するために、「このphpコードをどこに追加しますか?どこに配置すればよいかわかりません。フォーム送信は現在のページをリロードします。」(おそらくそれ以来、あなたはそれを理解しました;)):
2 つだけでなく、少なくとも 3 つ、さらには 4 つのケース (条件分岐) を処理する必要があります。
- 表示+送信用のフォームを送信します。
- フォーム データを受け取り、それをどこかに保存し (つまり、「新しいリソースを作成する」、背後にある考え方
201 Created
)、クリーンな URI にリダイレクトします。
- 何も起こらなかったかのようにフォームを再表示する (または同じページに永久にリダイレクトする) ことを避けるために、自分自身にリダイレクトしたかどうかを検出する必要があります... しかし、URI からすべての入力を削除したので、状態を追跡するには、他の手段を使用する必要があります。そのためのいくつかの簡単な方法:
a) 別の URI にリダイレクトします。
b) PHP セッションを使用します。
- 最後に、必要に応じて、新しい入力のためにフォームをリセットして再度表示します。
以下に例を示します (簡単にするために、3/b と一種の「偽の」4 を使用)。
session_start();
if (isset($_GET['some_input'])) // Case 2: We got data!
{
file_put_contents("result", $_GET['some_input']);
$_SESSION['redir'] = true;
header("Location: /used-cars/", true, 303);
exit;
}
else if (isset($_SESSION['redir'])) // Case 3: We have redirected!
{
unset($_SESSION['redir']);
http_response_code(201); // Acknowledge receiving the form data.
echo "OK, we have happily processed the last submitted data: ",
file_get_contents("result"), "<br>";
echo "Reload the page to fill the form again!"; // Case 4: Reset...
}
else // Case 1: Send the form...
{
echo <<<_
<form>
<input type="text" name="some_input">
<input type="submit">
</form>
_;
}