如果用户发布表单,然后单击浏览器刷新按钮,以下操作是否会停止我数据库中意外重复的条目?如何通过浏览器刷新防止重复的帖子?
<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
try {
// write to database
} catch($e) {
// error reporting
}
}
?>
如果用户发布表单,然后单击浏览器刷新按钮,以下操作是否会停止我数据库中意外重复的条目?如何通过浏览器刷新防止重复的帖子?
<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
try {
// write to database
} catch($e) {
// error reporting
}
}
?>
使用Post-Redirect-Get pattern - 数据成功提交后总是重定向。
我没有看到有任何代码可以区分第一篇文章和重复文章。你应该做的是在处理POST后将浏览器重定向到不同的URL,这样如果他们按下刷新,他们不会刷新表单的目标并重新POST。
您应该使用Dan Grossman的方法,POST操作后总是重定向。这也是另一种选择,它增加了额外的安全性:
将一次性令牌添加到您的表单并将其保存为$_SESSION
-变量。然后,如果它被使用(表单被提交),从会话中删除它(或创建一个新的标记)。如果表单再次发送,则两个标记不匹配,并且您有一个重复的条目(例如,您可以忽略第二个条目)。
不,因为如果他们点击刷新按钮(或后退/前进,无论什么),浏览器将尝试再次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.
}
?>
你试过了吗? – JJJ