【问题标题】:Reset URL on form submit在表单提交时重置 URL
【发布时间】:2023-04-03 00:00:02
【问题描述】:

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

【问题讨论】:

    标签: php html url url-rewriting


    【解决方案1】:

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

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

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

    【讨论】:

    • 我应该在哪里添加这个 php 代码?不知道放哪里,表单提交会重新加载当前页面。
    【解决方案2】:

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

    因此,要正确重置带有 GET 的表单 URI,请改用 303 See Other,为此目的专门为 added。

    (很高兴也可以将它与201 Created 响应结合起来,该响应旨在ack. successful form submissions,所以添加一个 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>
    _;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2015-04-12
      • 1970-01-01
      • 2019-02-09
      • 2012-09-11
      相关资源
      最近更新 更多