2011-07-16 46 views
3

如果用户发布表单,然后单击浏览器刷新按钮,以下操作是否会停止我数据库中意外重复的条目?如何通过浏览器刷新防止重复的帖子?

<?php 
    if($_SERVER['REQUEST_METHOD']=='POST') { 

     try { 
      // write to database 
     } catch($e) { 
      // error reporting 
     } 
    } 
?> 
+1

你试过了吗? – JJJ

回答

2

我没有看到有任何代码可以区分第一篇文章和重复文章。你应该做的是在处理POST后将浏览器重定向到不同的URL,这样如果他们按下刷新,他们不会刷新表单的目标并重新POST。

2

您应该使用Dan Grossman的方法,POST操作后总是重定向。这也是另一种选择,它增加了额外的安全性:

将一次性令牌添加到您的表单并将其保存为$_SESSION-变量。然后,如果它被使用(表单被提交),从会话中删除它(或创建一个新的标记)。如果表单再次发送,则两个标记不匹配,并且您有一个重复的条目(例如,您可以忽略第二个条目)。

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. 
    } 
?> 
相关问题