重置表单提交上的URL

时间:2012-07-03 19:08:44

标签: php html url url-rewriting

我有一个表单作为库存清单的过滤器。 表单效果很好,但我一直在使用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变量。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

首先,不要仅使用默认的header("Location..."),因为那样会发送302 Found(以前称为:Moved Temporarily)响应,有点像“谎言”实际行为(仍然表示“请求的资源暂时驻留在其他URI下” )。更糟糕的是:如果表单使用POST(大多数这样做),那么符合规范的浏览器甚至应该在重定向之前according to HTTP 1.1寻求许可。

因此,要使用GET正确重置表单URI,请改用added303 See Other

(很高兴也将它与针对ack. successful form submissions201 Created响应结合起来,因此添加了一个 将header("HTTP/2.0 201 Created")移至结果页面是个不错的选择。)

但是,为了解决您的旧评论“我将在哪里添加此php代码?我不确定将其放置在哪里,表单提交会重新加载当前页面。” (尽管您可能已经想到了从那以后开始;)):

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

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

    a)重定向到其他URI。

    b)使用一个PHP会话。

  4. 最后,如果需要的话:重置并再次显示表单以供新输入。

这里有个例子(为简单起见,有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>
_;
}