【问题标题】:Refreshing a web page inserts data again to DB刷新网页会再次将数据插入数据库
【发布时间】:2010-06-28 16:04:43
【问题描述】:

我有一个带有表单的 php 网页。在网页中填写表格后,我可以将其提交到服务器。但在那之后,如果我刷新页面,它会将相同的记录插入数据库。这个问题有解决办法吗?

【问题讨论】:

    标签: php database forms save submit


    【解决方案1】:

    使用POST/Redirect/GET 模式。这将阻止用户重新提交相同的表单。

    【讨论】:

      【解决方案2】:

      有多种方式,例如:

      • 创建一个插入到表单中的令牌(隐藏字段)。如果相同的令牌被提交两次,则丢弃第二次提交。
      • 如果已经存在相同的帖子,请检查数据库。
      • 将表单提交保存在会话变量中。
      • 使用Post/Redirect/Get pattern 将用户重定向到提交后的第二个页面(最好与上述之一结合使用)。

      【讨论】:

      • +1:形成身份验证令牌。还有助于防范 CSRF。
      【解决方案3】:

      是的,做两个查询。第一个检查以确保数据库中不存在数据,如果没有重复数据,第二个会插入。有很多方法可以检查以确保不存在重复数据,但这是您需要经历的基本过程。

      【讨论】:

        【解决方案4】:

        嗯,这就是 Refresh 的意思:“再做一次。”

        您可以检查与提交数据匹配的数据是否已经在数据库中。如果是这样,您可以拒绝新的提交。

        【讨论】:

          【解决方案5】:

          在插入数据库之前检查相同的值是否已经重复,如果它们是重复的,则不要插入。检查多个列有助于进一步。例如,您可以检查“用户名”和“密码”,而不是只检查“用户名”。

          显然上面的例子是假的,但你应该明白这一点。

          【讨论】:

            【解决方案6】:

            您可以创建一个 process.php 页面并将表单的action 设置为它。

            在process.php中

            //code to insert item to database
            header('Location: YOUR_FORM_PAGE_HERE);
            

            然后它会将它们发送回原始页面并且不会有任何帖子数据

            【讨论】:

            • 浏览器不需要发送HTTP_REFERER标头,可以为空。
            • @Douglas,谢谢我改了。如果他知道位置,他将不需要它。我只是为了概括而使用了 HTTP_REFERER
            【解决方案7】:

            您可以将查询更改为INSERT IGNORE INTO table_name ...

            这将阻止您插入两次。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-07-17
              • 2012-06-07
              • 1970-01-01
              • 1970-01-01
              • 2015-02-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多