MYSQL неожиданно вставляет несколько строк

У меня возникла проблема, и я надеялся, что кто-то сможет мне помочь.

Моя проблема в том, что всякий раз, когда я запускаю код в "MainFile", он выводит два идентификатора, в которые он добавил записи, но тогда, когда я просматриваю свою базу данных, вместо шесть записей из двух... Может ли кто-нибудь сказать мне, почему это может быть сделано?

Примечание. Я только предоставил фрагменты кода из классов, потому что предоставление полных классов было бы слишком большим количеством кода. Это единственный исполняемый код.

КОД В ИСТОРИИ ИЗДАНИЯ

Изменить: я добавил отладочный журнал в нижней части этого сообщения, проверяя, что я выполняю только код 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");

Ответ 1

Я не уверен, что это отвечает на ваш вопрос, но вы, кажется, указываете ID, который вы вставляете. Я не уверен, не используете ли вы PRIMARY KEY в своем столбце id или почему это вообще работает, но, возможно, вам нужно это:

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

Ответ 2

При обновлении UPDATE tl_comments SET thread=? WHERE id = ? и втором? не заменяется действительным существующим идентификатором, но вместо этого остается пустым, база данных не может найти запись для обновления и вместо этого вставляет новую строку. Таким образом, создается еще одна запись, которая приведет вас к генерации 2 строк вместо одного запроса каждый раз.

Это означает, что функция GetLastInsertID() работает неправильно. Это может быть вызвано несколькими вещами, но есть много полезных советов по этому вопросу в stackoverflow.

Ответ 3

Я не смог найти какую-либо логическую проблему в предоставленном вами фрагменте кода. Однако вы можете внести следующие изменения и опубликовать вывод здесь:

  • Добавить получателя для переменной member_statements.
  • После того, как ваш запрос на ввод завершен, распечатайте выходные данные вышепользователя.

Как написано этот класс доступа к БД, очевидно, что в одном индексе массива "ready_statements" не существует двух запросов на вставку. Еще лучше проверить и подтвердить. Также, если вы можете совместно использовать функцию (под которой выполняется фрагмент кода вставки запроса), а фрагмент кода, из которого вызывается эта функция, может быть полезен для других, чтобы отладить проблему.

Ответ 4

Я чувствую, что где-то в вашем коде работает цикл, который вызывает его вставку несколько раз в базу данных. Можете ли вы попробовать эхо-запрос, чтобы узнать, сколько раз ваш запрос запущен.

Другим взломом может быть условие, чтобы проверить, существует ли уже существующая строка - не вставлять.

Можете ли вы разместить свой код, чтобы я мог его отладить.

Ответ 5

Кстати, вам не хватает второй } в строке 51 пастебина, который вы опубликовали. if(sizeof($binds) > 0){ не был закрыт.