簡體   English   中英

MYSQL意外插入多行

[英]MYSQL inserting multiple rows unexpectedly

我有一個問題,並希望有人可以幫助我。

我的問題是每當我在“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");

我不確定這會回答您的問題,但您似乎在指定要插入的ID 我不確定你是不是在你的id列上使用了PRIMARY KEY ,或者為什么這根本不起作用,但也許你想要這個:

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

更新UPDATE tl_comments SET thread=? WHERE id = ? UPDATE tl_comments SET thread=? WHERE id = ? 和第二個? 如果沒有替換為有效的現有ID,而是保持為空,則數據庫找不到要更新的條目,而是插入新行。 因此,創建另一個條目將導致您每次查詢時生成2行而不是一行。

這意味着GetLastInsertID()函數無法正常工作。 這可能是由一些事情引起的,但是在stackoverflow上已經有很多有用的提示來解決這個問題。

我找不到您提供的代碼段中的任何邏輯問題。 但是,您可以進行以下更改並在此處發布輸出:

  1. 為“prepared_statements”成員變量添加一個getter。
  2. 插入查詢完成運行后,打印出上面的getter函數輸出。

這個DB訪問類的編寫方式很明顯,“prepared_statements”數組的單個索引中不存在兩個插入查詢。 還是最好檢查並確認。 此外,如果您可以共享該功能(在其下運行插入查詢代碼段),並且調用此函數的代碼片段對其他人來說可能對調試問題很有用。

我覺得你的代碼中的某個地方正在運行一個循環,導致它在數據庫中多次插入。 您可以嘗試回顯查詢,以便了解查詢運行的次數。

另一個hack可以放置條件來檢查行是否已經存在 - 不插入。

你可以發布你的代碼,以便我可以調試它。

順便說一句,你錯過了你發布的pastebin第51行的第二個} if(sizeof($binds) > 0){未關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM