PHP清除浏览器缓存以避免刷新后重新发送表单数据

时间:2010-11-16 16:41:01

标签: php caching browser

我正在开发一个PHP-MySQL应用程序,使注册用户能够输入文本注释。问题是:

  1. 用户登录网站 - OKAY
  2. 用户提交了一份表单以提交文本评论 - OKAY
  3. 用户输入文字评论并提交 - OKAY
  4. 我有一个例行程序可以清理评论&将其保存到MySQL中(使用userid,textcomment,datetime戳)&向用户显示他/她的评论已输入 - OKAY
  5. 用户决定刷新浏览器 - 输入重复的评论 - BAD!
  6. 我在想3个选项:

    • 选项1:检查的例程:上次用户发表评论,如果是,请检查这是否重复。如果重复则显示错误消息。
    • 选项2:不允许用户过快发布的例程。所以基本上不允许在1分钟左右发布评论。因此,如果浏览器刷新,则注释将被忽略。
    • 选项3:操纵浏览器缓存以清除其内容,以便刷新时不会输入任何重复内容。

    现在在我的应用程序的上下文中,我对OPTION 1和OPTION 2的关注是性能PHP-MySQL,因为我已经在推送/从数据库获取数据的同一页面中有各种查询。因此,选项3可能会以不同的方式解决问题。

    问题是:如果我选择第3选项,这可以被视为最佳实践吗?意味着清除浏览器缓存是最有效的解决方案吗?我看过那也有后果吗?你的想法很感激!

6 个答案:

答案 0 :(得分:4)

在将数据提交到数据库后,只需进行重定向。这是一种常见的做法。

http redirect指示浏览器为指定的网址发布http GET(而不是用于提交表单的http POST)。如果在将数据插入数据库后立即执行此操作,则当用户刷新其浏览器时,除了再次看到同一页面之外,不会发生任何事情。

This question on SO告诉您如何使用php重定向。

答案 1 :(得分:4)

将已插入的变量插入数据库

后,取消设置
<?php
    if(isset($_POST["comment"])){
        //store in the database
        //on successful storage
        unset($_POST["comment"]);
    }
?>

因此,当用户刷新页面时,不会回发该值...

答案 2 :(得分:1)

您需要实施Post/Redirect/Get pattern

答案 3 :(得分:0)

我会使用选项4:使用一次性表单令牌来验证表单请求。如果请求成功,则使令牌无效。

执行此操作时,即使在重定向后返回到表单也不允许它再次发送表单。此外,这也将使CSRF攻击变得更加困难。

答案 4 :(得分:0)

将数据输入数据库后,使用header或location.href

重定向页面

答案 5 :(得分:-4)

我找到了新方法试试这个。

   function PreventResendData($invalidpage='index.php'){

    if(   $_POST && !is_array( $_SESSION['post_var'] )   ) {

        $_SESSION['post_var'] = $_POST;
        header('location:'.$_SERVER['PHP_SELF']);

    }
    else if($_SESSION['post_var'])
    {
        $_POST = $_SESSION['post_var']; 
        $_SESSION['post_var'] = '';
    }
    else
    {
        header("location:".$invalidpage);
    }

}