MYSQL意外插入多行

时间:2015-05-29 08:22:10

标签: php mysql sql duplicates sql-insert

我有一个问题,并希望有人可以帮助我。

我的问题是每当我在" MainFile"中运行代码时,它会输出已添加条目的两个ID,但是当我查看我的数据库时,我有六个条目而不是两个......有谁可以告诉我为什么它可能会这样做?

注意:我只提供了类中代码的片段,因为提供完整的类代码太多了。这是唯一可以执行的代码。

编辑历史中的代码

编辑:我已在此帖子的底部添加了一个调试日志,验证我每次查询只执行一次SQL代码。

编辑:我不再使用序列化方法,因为存储此类数据显然不是一个好主意。但是,即使我的新代码将每个单独的值存储在数据库中,我仍然得到三个条目而不是一个条目。所以,它是同一个问题。什么?

编辑:经过几天的调试后,我已将其缩小到导致问题的这一行

Throwlite::$systemSQL->executeSql("INSERT into ".SQL_COMMENTTHREADS_TABLE." (id, sort_order) values (DEFAULT, '2')");

您可以在此处查看LiteSQL类以供参考:http://pastebin.com/a4C6fF4u

此外,作为参考,以下是用于创建表的代码:

"CREATE TABLE IF NOT EXISTS `" . SQL_COMMENTTHREADS_TABLE . "` (`id` int unsigned NOT NULL AUTO_INCREMENT, `sort_order` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;"

而且,即使我非常确定它不重要,这就是定义SQL_COMMENTTHREADS_TABLE的地方。

define( 'SQL_COMMENTTHREADS_TABLE', "tl_comment_threads");

5 个答案:

答案 0 :(得分:1)

我不确定这会回答您的问题,但您似乎在指定要插入的ID。我不确定你是不是在你的id列上使用了PRIMARY KEY,或者为什么它根本不起作用,但也许你想要这个:

INSERT INTO " . SQL_COMMENTS_TABLE . " (id, thread) VALUES (DEFAULT, ?)

答案 1 :(得分:0)

更新 public class NoIdAttrProcessor extends AbstractAttributeModifierAttrProcessor { public NoIdAttrProcessor() { super("noid"); } @Override public int getPrecedence() { return 9999; } @Override protected ModificationType getModificationType(Arguments arguments, Element element, String attributeName, String newAttributeName) { return ModificationType.SUBSTITUTION; } @Override protected boolean removeAttributeIfEmpty(Arguments arguments, Element element, String attributeName, String newAttributeName) { return true; } @Override protected boolean recomputeProcessorsAfterExecution(Arguments arguments, Element element, String attributeName) { return false; } @Override protected Map<String, String> getModifiedAttributeValues(Arguments arguments, Element element, String attributeName) { Map<String, String> values = new HashMap<>(1); values.put("id", ""); return values; } } 和第二次?如果没有替换为有效的现有ID,而是保持为空,则数据库找不到要更新的条目,而是插入新行。因此,创建另一个条目会导致您每次查询时生成2行而不是只有一行。

这意味着UPDATE tl_comments SET thread=? WHERE id = ?功能无法正常工作。这可能是由一些事情引起的,但在stackoverflow上已经有很多有用的提示。

答案 2 :(得分:0)

我找不到您提供的代码段中的任何逻辑问题。 但是,您可以进行以下更改并在此处发布输出:

  1. 为“prepared_statements”成员变量添加一个getter。
  2. 插入查询完成后,打印输出上面的getter函数。
  3. 这个DB访问类的编写方式很明显,“prepared_statements”数组的单个索引中不存在两个插入查询。还是最好检查并确认。 此外,如果您可以共享该功能(在其下运行插入查询代码段),并且调用此函数的代码片段对其他人来说可能对调试问题很有用。

答案 3 :(得分:0)

我觉得你的代码中有一个循环正在运行,导致它在数据库中多次插入。您可以尝试回显查询,以便了解查询运行的次数。

另一个hack可以放置条件来检查行是否已经存在 - 不插入。

请您发布您的代码,以便我可以调试它。

答案 4 :(得分:0)

顺便说一句,您在发布的pastebin的第51行上缺少第二个}if(sizeof($binds) > 0){未关闭。