我有一个问题,并希望有人可以帮助我。
我的问题是每当我在" 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");
答案 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)
我找不到您提供的代码段中的任何逻辑问题。 但是,您可以进行以下更改并在此处发布输出:
这个DB访问类的编写方式很明显,“prepared_statements”数组的单个索引中不存在两个插入查询。还是最好检查并确认。 此外,如果您可以共享该功能(在其下运行插入查询代码段),并且调用此函数的代码片段对其他人来说可能对调试问题很有用。
答案 3 :(得分:0)
我觉得你的代码中有一个循环正在运行,导致它在数据库中多次插入。您可以尝试回显查询,以便了解查询运行的次数。
另一个hack可以放置条件来检查行是否已经存在 - 不插入。
请您发布您的代码,以便我可以调试它。
答案 4 :(得分:0)
顺便说一句,您在发布的pastebin的第51行上缺少第二个}
。 if(sizeof($binds) > 0){
未关闭。