【问题标题】:INSERT command inserting duplicatesINSERT 命令插入重复项
【发布时间】:2010-12-27 01:26:36
【问题描述】:

我正在编写一个测验网站。
应该发生的是:

  • 一个页面上有一个问题和四个按钮或一个文本框。
  • 当你点击一个按钮时,它会用 地址中的答案号码 喜欢:?q=[question number]&a=[answer].
  • 如果问题 使用它发布答案的文本框。
  • 然后此代码应检测到 一些东西已经发送给它,并且 将其写入数据库。
  • 用户 ID 存储在 cookie 中。
  • 数据库中还有一个键列。这个想法是它存储用户随时间提交的所有答案,并且用户可以更改他们的答案。

我认为这无关紧要,但稍后在代码中,它会使用 SELECT 命令查询数据库。
当我运行此代码时,它似乎在数据库中输入了 2 或 3 个条目。趋势似乎是,当我运行代码时,它会输入上一个答案,然后是新答案。 任何帮助将不胜感激。谢谢,

洛根

【问题讨论】:

  • 对特定用户的问题有多个答案是否无效?您可能需要考虑在您的表上使用唯一约束来强制执行此操作。
  • 看来你可能已经删掉了一些代码,如果是这样的话,你能把剩下的包括进去吗?
  • 咳嗽。这看起来很容易受到 SQL 注入的攻击。请转义你的变量...
  • 它在使用魔术引号的情况下运行,它在本地服务器上,没有人想注入它。我想我把代码放回去了。
  • 对于代码块,缩进 4 个空格或使用工具栏上的代码格式化按钮。仅对简短的 inline 代码段使用反引号。

标签: php mysql


【解决方案1】:

另一种选择是首先尝试检索您将要输入数据库的数据。如果你找到它,它已经在那里,所以不要再添加它。使用约束的建议是合理的,但如果您试图防止重复的数据不容易添加到约束中,或者您不希望重复的数据不是完全相同的数据(说只是类似的数据)那么这是另一种选择。

【讨论】:

    【解决方案2】:

    如果您只允许每个用户有一个答案,则绝对应该添加 cmptrgeekken 提到的唯一约束,但是如果发生主键违规,您还必须处理:通知用户它已经回复或替换以前的值,具体取决于您希望网站如何运作。

    另外,由于某种原因,请求是否多次触发?也许通过javascript或您的其他逻辑?如果仅单击一次时出现重复答案,则似乎是这种情况。

    /B

    【讨论】:

      【解决方案3】:

      似乎您想要做的是每个用户每个问题只允许一个答案。如果是这种情况,您需要在用户 ID 和 qid 上的表上使用 UNIQUE 约束:

      ALTER TABLE answers ADD UNIQUE(userid,qid);
      

      当您尝试插入具有相同用户 ID 和 qid 的行时,这将导致错误。如果您想允许用户更改他们的错误,您可以将您的 INSERT 查询更改为:

      INSERT INTO answers (userid ,answer ,qid) VALUES ($uid, '$answer', $qid) ON DUPLICATE KEY UPDATE answer='$answer'
      

      这将防止多条记录出现在数据库中,但仍可能从您的 PHP 代码中调用多个 INSERT。要解决这个问题,我们必须查看更多代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-03
        相关资源
        最近更新 更多