【发布时间】:2010-12-30 02:07:31
【问题描述】:
例如,我问了这个问题,然后点击“发布您的问题”并停留在当前页面。现在我可以点击浏览器的“刷新”按钮来查看新的答案。但是我发现在我的网站上,如果我点击“刷新”按钮,就会发布一个重复的问题。如何避免这个问题? 我正在使用 PHP。
【问题讨论】:
-
如何判断数据是否已经提交?
-
stackoverflow.com 如何避免/解决这个问题?
例如,我问了这个问题,然后点击“发布您的问题”并停留在当前页面。现在我可以点击浏览器的“刷新”按钮来查看新的答案。但是我发现在我的网站上,如果我点击“刷新”按钮,就会发布一个重复的问题。如何避免这个问题? 我正在使用 PHP。
【问题讨论】:
首先,为您的表单使用 POST。几乎每个浏览器都会在刷新 POST 表单结果时要求用户确认,因为它必须重新提交。
其次,在您的表单处理脚本中,检查问题是否已经存在 - 或者为用户设置会话并跟踪他们最近是否提交了一些内容。
【讨论】:
在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 删除即可。
【讨论】:
$_POST 请求之后发生,否则你将创建一个无限循环的重定向。
refresh,则不会出现要再次提交的 POST 数据。该请求将是一个GET 请求,并且根本不会发送POST 数据,因此isset 测试将返回false
使用 POST 提交表单,提交验证后,如果一切正常将用户重定向到成功页面,这样如果用户刷新页面,他要做的就是看到“谢谢你”页面。
【讨论】: