1

我有一个表单,可以作为库存列表的过滤器。该表单效果很好,但我一直在使用 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 的获取参数。

有没有办法,不提交表单,它会重置所有参数?

http://www.website.com/used-cars/?pos=10&q=Model-Corolla%2C&srt=KMDfr

那将是预制件提交,一旦提交了表单,它将如下所示:

http://www.website.com/used-cars/

并且页面将不再有 GET 变量。

4

2 回答 2

2

是的,在您完成处理后,请致电

header("Location: /used-cars/");
die();

它会将用户重定向到想要的页面。

于 2012-07-03T19:11:40.097 回答
0

首先,不要只使用默认值header("Location..."),因为这会发送一个302 Found(以前称为Moved Temporarily:)响应,这对实际行为有点“谎言”(因为它仍然意味着“请求的资源暂时驻留在不同的 URI 下”)。更糟糕的是:根据 HTTP 1.1POST,如果表单使用(大多数都使用),则符合标准的浏览器甚至应该在重定向之前请求许可。

因此,要使用 , 正确重置表单 URI ,请GET使用303 See Other专门 为此目的添加的 URI。

(很高兴将它与201 Created旨在确认的响应结合起来。成功的表单提交,因此将 a 添加 header("HTTP/2.0 201 Created")结果页面是一个不错的选择。)

但是,为了解决您的旧评论“我将在哪里添加此 php 代码?我不确定该放在哪里,表单提交会重新加载当前页面。” (虽然你可能从那时起就明白了;)):

您不仅要处理两种,而且至少要处理三种,甚至四种情况(在条件分支中):

  1. 您发送用于显示+提交的表单。
  2. 您收到表单数据,将其存储在某个地方(即“创建新资源”,背后的想法201 Created),然后重定向到一个干净的 URI。
  3. 为了避免像什么都没发生一样再次重新显示表单(或永远重定向到同一页面),您必须检测您是否刚刚重定向到自己......但是,由于您现在已经从 URI 中删除了所有输入,您必须使用其他方式来跟踪状态。一些直接的方法:

a) 重定向到不同的 URI。

b) 使用 PHP 会话。

  1. 最后,如果需要:重置并再次显示表单以获取新输入。

这是一个示例(为简单起见,使用 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>
_;
}
于 2018-10-10T23:23:51.663 回答