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){
не был закрыт.