【问题标题】:PHP clear browser cache to avoid form data resend after refreshPHP清除浏览器缓存以避免刷新后重新发送表单数据
【发布时间】:2011-05-10 22:33:28
【问题描述】:

我正在开发一个 PHP-MySQL 应用程序,它允许注册用户输入文本 cmets。问题是:

  1. 用户登录网站 - 好的
  2. 向用户展示了提交文本评论的表单 - 好的
  3. 用户输入文本评论并提交 - OKAY
  4. 我有一个例程来清理评论并将其保存到 MySQL(使用用户 ID、文本评论、日期时间戳)并向用户展示他/她的评论已输入 - 好的
  5. 用户决定刷新浏览器 - 输入了重复的评论 - 错误!

我在想 3 个选项:

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

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

问题是:如果我选择选项 3,这是否可以视为最佳实践?意思是清除浏览器缓存是最好最有效的解决方案?我读过也有后果吗?感谢您的想法!

【问题讨论】:

    标签: php caching browser


    【解决方案1】:

    在您将发布的变量插入数据库后,只需取消设置它

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

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

    【讨论】:

    • 这不起作用 - 数据存储在浏览器中并且取消设置不会有帮助(我希望它会......重定向意味着时间......)
    • 对我来说,在成功登录后立即取消设置后数据就可以了。然后,如果用户在浏览器历史记录中退后一步,数据就会丢失并且浏览器无法找到。工作完成;)
    【解决方案2】:

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

       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);
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      将数据输入数据库后,使用 header 或 location.href 重定向页面

      【讨论】:

        【解决方案4】:

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

        http redirect 指示浏览器为指定的 url 发出 http GET(与用于提交表单的 http POST 相反)。如果您在将数据插入数据库后立即执行此操作,则当用户刷新浏览器时,除了再次看到相同的页面外,什么都不会发生。

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

        【讨论】:

        • 对不起,我的无知,重定向是什么意思?
        • 重定向意味着发送 HTTP 状态 302。查看 PHP 文档以了解标头方法:php.net/manual/en/function.header.php - 搜索“位置:”
        • 明白了,所以我会在插入数据后立即重定向到同一页面。现在,这可以从“后退”按钮覆盖我吗?意思是用户点击返回并重新提交?
        • @Thilo: 303 将是 POST 重定向的适当状态代码。
        • 我测试了它并且它工作正常,基本上我完全按照你说的做了,在插入到数据库之后我做了一个标题(“位置:...)并且创造了奇迹!谢谢
        【解决方案5】:

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

        这样做时,即使在重定向后返回表单也不允许它再次发送表单。此外,这也会使 CSRF 攻击更加困难。

        【讨论】:

        • 我可能同意你的选项 4,不幸的是我此时没有使用 SESSION 变量,并且此时添加额外的 SQL 表来存储这些值也是不可取的
        【解决方案6】:

        你需要实现Post/Redirect/Get pattern

        【讨论】:

        • 不幸的是,我对大多数页面都使用了 apache_mod_rewrite,因此不能在结果页面上显示 GET。否则我会打破 mod_rewrite 规则,我猜
        • 那是完全独立于模式的。请注意重定向到正确的 URL。
        猜你喜欢
        • 1970-01-01
        • 2012-12-03
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多