【问题标题】:How to avoid duplicate when a user click the "refresh" button of his browser?当用户单击浏览器的“刷新”按钮时如何避免重复?
【发布时间】:2010-12-30 02:07:31
【问题描述】:

例如,我问了这个问题,然后点击“发布您的问题”并停留在当前页面。现在我可以点击浏览器的“刷新”按钮来查看新的答案。但是我发现在我的网站上,如果我点击“刷新”按钮,就会发布一个重复的问题。如何避免这个问题? 我正在使用 PHP。

【问题讨论】:

  • 如何判断数据是否已经提交?
  • stackoverflow.com 如何避免/解决这个问题?

标签: php html browser


【解决方案1】:

首先,为您的表单使用 POST。几乎每个浏览器都会在刷新 POST 表单结果时要求用户确认,因为它必须重新提交。

其次,在您的表单处理脚本中,检查问题是否已经存在 - 或者为用户设置会话并跟踪他们最近是否提交了一些内容。

【讨论】:

  • 但是我的浏览器(Firefox)没有要求我确认。
【解决方案2】:

POST 请求之后,通常的做法是重定向到同一页面以避免此问题。

假设你在/ask_question.php

您的开头<form> 标记可能如下所示:

<form action="/ask_question.php" method="post">

现在,在您的 /ask_question.php 中执行以下操作:

if( isset($_POST['new-question'])){
    // Do your processing here

    // On success:
    header('Location: /ask_question.php');
    exit(); // End the request
}

更新 只有在处理了有效的$_POST 请求后才进行重定向很重要。我测试了一个名为 new-question 的表单字段,但您应该使用必须存在的任何表单字段名称,$_POST 才能成功

这会处理他们发布的数据,然后在成功时重定向回同一页面。现在唯一不同的是,当他们点击刷新时,不会发布任何信息。

注意只需确保在调用 header 之前没有任何内容被 echo 删除即可。

【讨论】:

  • @Alix 哈哈。但是,我太冗长了。您的答案要短得多,并且可能更好地传达答案:)
  • if(isset($_POST['new-question'])) 是什么意思?有区别吗?
  • 我更新了我的答案以进一步解释这一点,但这是我展示有效 $_POST 请求测试的方式。你可以做任何你想做的事,但只要确保重定向只会在$_POST 请求之后发生,否则你将创建一个无限循环的重定向。
  • 你的意思是如果用户点击他的网络浏览器的“刷新”,(isset($_POST['new-question'])) 会返回false?
  • Steven,如果您完全按照我的代码进行操作,用户将被“重定向”回页面。如果他们然后单击refresh,则不会出现要再次提交的 POST 数据。该请求将是一个GET 请求,并且根本不会发送POST 数据,因此isset 测试将返回false
【解决方案3】:

使用 POST 提交表单,提交验证后,如果一切正常将用户重定向到成功页面,这样如果用户刷新页面,他要做的就是看到“谢谢你”页面。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多