我有一个表单,用作库存列表的过滤器。表单运行良好,但我一直在使用 get 以便用户翻阅页面,例如:
<a href="http://website.com/index.php?page_id=6&pos=<?php echo $i;?>&q=<?php echo $q;?>&srt=<?php echo $sort;?>">Next page</a>
<?php } ?>
我从XML获取数据,这是我发现最有效的方式。但是,要过滤的表单是 POST,如果用户单击下一页并尝试使用过滤器(一堆下拉框),那么它还使用已从链接传递给 URL 的 get 参数。
有没有办法,没有表单提交,它会重置所有参数?
http://www.website.com/used-cars/?pos=10&q=Model-Corolla%2C&srt=KMDfr
这将是预表单提交,提交表单后,它将如下所示:
http://www.website.com/used-cars/
并且页面将不再有 GET 变量。
是的,完成处理后,请致电
header("Location: /used-cars/");
die();
它会将用户重定向到想要的页面。
首先,不要只使用默认header("Location...")
,因为这会发送一个302 Found
(以前称为:Moved Temporarily
)响应,这有点"谎言"实际行为(因为它仍然意味着"请求的资源暂时驻留在不同的 URI 下")。更糟糕的是:如果表单使用POST
(大多数都这样做),根据HTTP 1.1,符合标准的浏览器甚至应该在重定向之前请求许可。
因此,要使用GET
正确重置表单 URI,请改用 303 See Other
,这是专门为此目的添加的。
(很高兴将其与旨在确认成功表单提交的201 Created
响应相结合,因此添加一个 header("HTTP/2.0 201 Created")
到结果页面是一个不错的触摸。
但是,为了解决您的旧评论"我将在哪里添加此 php 代码?我不确定把它放在哪里,表单提交会重新加载当前页面。 (尽管您可能从那时起就想通了;)):
您不仅要处理两种情况,还要处理至少三种甚至四种情况(在条件分支中):
- 您发送用于显示 + 提交的表单。
- 您收到表单数据,将其存储在某个地方(即"创建新资源",
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>
_;
}