如果用户发布表单然后单击浏览器刷新按钮,以下内容是否会阻止数据库中的意外重复条目?
<?php
if( $_SERVER['REQUEST_METHOD']=='POST' ) {
try {
// write to database
} catch($e) {
// error reporting
}
}
?>
答案 0 :(得分:13)
使用Post-Redirect-Get pattern - 在成功提交数据后始终重定向。
答案 1 :(得分:3)
不,因为如果他们点击刷新按钮(或后退/前进,无论如何),浏览器将再次尝试POST。你想要的是Post/Redirect/Get范例。请注意,这只会阻止通过导航重复提交。如果您想要防止多次点击表单提交的重复提交,您必须使用javascript在帖子尝试期间以某种方式禁用该按钮。
一些代码:
<?php
if ('POST' == $_SERVER['REQUEST_METHOD']) {
//do processing
//303 forces a GET request
header("Location: thank-you-page", true, 303);
exit;
}
else {
//handle bad page visit.
}
?>
答案 2 :(得分:2)
我没有看到任何代码可以区分第一篇文章和重复帖子。你应该做的是在处理完POST后将浏览器重定向到另一个URL,这样如果他们按下刷新,他们就不会刷新表单的目标并再次进行POST。
答案 3 :(得分:2)
您应该使用 Dan Grossman 的方法,在POST操作后始终重定向。这也是另一种选择,它增加了额外的安全性:
向表单添加一次性令牌并将其保存到$_SESSION
- 变量。然后,如果使用它(表单已提交),则将其从会话中删除(或创建新令牌)。如果然后再次发送表单,则两个令牌不匹配,并且您有一个重复的条目(例如,您可以忽略第二个)。