如何通过浏览器刷新来防止重复的帖子?

时间:2011-07-16 14:54:59

标签: php

如果用户发布表单然后单击浏览器刷新按钮,以下内容是否会阻止数据库中的意外重复条目?

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

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

4 个答案:

答案 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 - 变量。然后,如果使用它(表单已提交),则将其从会话中删除(或创建新令牌)。如果然后再次发送表单,则两个令牌不匹配,并且您有一个重复的条目(例如,您可以忽略第二个)。