【问题标题】:Avoid resending forms on php pages避免在 php 页面上重新发送表单
【发布时间】:2023-03-27 12:20:02
【问题描述】:

有没有办法在我刷新 php 页面时避免重新处理表单?在刷新带有插入功能的 php 文件的链接时,我想防止重新发送表单。例如,我正在处理用户在每页顶部写的一系列笔记以获取新笔记。除了明显地创建一个带有标头函数的单独 php 文件之外,还有其他方法吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    使用Post-Redirect-Get Pattern

    1. 接受 Post 请求
    2. 处理数据
    3. 发出重定向响应
    4. 接受获取请求
    5. 发出 200 响应

    如果您需要显示提交内容中的数据,请在(例如)您重定向到的 URL 的查询字符串中包含行 ID 或类似内容。

    【讨论】:

    • 接受 get 请求并发出 200 响应是什么意思?
    • 浏览器发出一个请求,其中包含“GET /url/you/redirected/to HTTP/1.1”,您的服务器响应“HTTP/1.1 200 OK”、其他一些标头和一些内容.
    • 只有用户刷新页面,浏览器才会发出get请求?在 PHP 中会是什么样子?
    • 不,它是由浏览器发出的,作为对获得重定向响应的反应。它看起来就像 PHP 将获得的任何其他请求一样($_POST 中没有数据)。
    • 重定向响应具体是什么? “标题”?
    【解决方案2】:

    最好的方法是在处理完表单后拨打header("location: form.php"); 电话。这会将您重定向回表单页面,如果您刷新,浏览器将不会重新发送表单数据。

    或者,您可以检查您是否已经处理了收到的数据,但这仍然会给您一个浏览器警告消息,提示您将重新发送数据。

    您可以同时使用这两种方法,以防有人使用后退按钮并不小心再次单击了提交。

    【讨论】:

      【解决方案3】:

      只需在您第一次处理表单时设置一些标志,以便稍后检查并中止重新处理。会话变量或 cookie 可以正常工作。

      【讨论】:

        【解决方案4】:

        您可以将一个 nonce 放入只允许使用一次的页面中,这样如果您看到相同的 nonce 进入,您就不会插入页面。

        【讨论】:

          【解决方案5】:

          我在处理完表单后将用户重定向到一个新页面。

          该表单是对do-something.php 的 POST 请求。我检查输入数据,如果验证通过,我会处理数据并重定向到do-something.php?somethingdone。因此,用户可以在不重新发送 POST 请求的情况下按 F5。

          【讨论】:

            【解决方案6】:

            我尝试使用 header("Location:..."), $_POST = array(), unset($_POST),但是(我知道为什么)它们在我的 php 页面中不起作用。

            所以,我所做的,我只是用了

            echo '< script>window.location.replace("http://.../this.php")</script>'

            ?效果很好!可能不是个好主意,我正在学习 PHP 第 4 周。

            【讨论】:

            猜你喜欢
            • 2020-12-16
            • 1970-01-01
            • 2014-06-05
            • 2012-12-03
            • 1970-01-01
            • 2016-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多