簡體   English   中英

活動記錄中的多余合詞WHERE子句:它們來自何處?

[英]Extra conjuncts in active record WHERE clause: Where are they coming from?

當我使用的CodeIgniter應用程序嘗試執行特定的UPDATE操作時,出現一個非常奇怪的數據庫錯誤。

活動記錄調用為:

$this->db->update('eval_events',
                  array('eval_event_totalscore'=>$result['average_score'],
                        'eval_event_average_totalscore=>$result['average_score']),
                  array('eval_event_id'=>$eval_event_id));

和報告的錯誤是:

Error Number: 1054

Unknown column 'id' in 'where clause'

UPDATE `eval_events` SET `eval_event_totalscore` = '40.0000', `eval_event_average_totalscore`
= '40.0000' WHERE `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = 
'581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND 
`id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581' AND `id` = '581'
AND `eval_event_id` = '565'

?? 所有那些涉及`id`的多余合意從何而來?

顯然,我沒有通過它們,而我對CI_active_record.php閱讀並沒有提供任何線索。

其他可能相關的三段信息:

  1. 據我所知,這種故障僅發生在我的開發機器上。 該查詢似乎在生產機器上很好。
  2. 如果我將對update()調用注釋掉,則隨后update()調用將以完全相同的方式損壞。
  3. 值“ 581”在這些更新所屬的操作的整體上下文中非常重要,但這是另一個表中的鍵(無論如何,它綁定到名為“ pid ”的列,而不是“ id”的列)。

感覺好像Active Record代碼已經緩存了`id` ='581',這是由於某種原因導致它現在將該緩存的內容咳出到我的UPDATE語句中。

我承認我不理解Active Record的start_cache() / stop_cache() / flush_cache()方法真正適合什么-但這沒關系,因為grep -r告訴我沒有在應用程序代碼庫中的任何地方調用start_cache()

僅出於笑容,我嘗試在失敗的update()調用之前立即調用$this->db->flush_cache() ,但是它沒有任何改變。

我不知道下一步該怎么解決。

有任何想法嗎? 任何人?

好的:將, echovar_export()debug_print_backtrace()進行救援。

事實證明,在進行失敗的update()調用的函數之前,有一個函數總共被調用了16次。 16恰好是錯誤的UPDATE語句中額外的`id` ='581'並置數。

在該較早的函數中,包含以下代碼(順便說一句,我沒有寫任何此類垃圾):

$this->db->where('id',$pid);  // <=== WTF???
$sql = "SELECT id FROM project_score WHERE pid=$pid AND uid=$uid AND scoretype=1";
$result = $this->db->query($sql)->row_array();

這幅畫怎么了?

那么,除了采用活動記錄所有的可疑的選擇,*活動記錄query()方法不使用任何一個已經事先電話squirreled客場where()

因此,仍然存在16個虛假條件隊列,等待將其自身附加到隨之而來的第一個毫不懷疑的update() (或select()或其他)調用。

為什么在生產系統上也不會發生這種情況?

好了,關於我的開發系統,我暫時注釋掉了別的東西 (我沒有很在意),這是因為在我的本地PHP缺少一些配置的失敗-我不喜歡重建權即可。

顯然,我注釋掉的所有內容都包含一個Active Record調用,其中強加了16個條件的隊列-但是它們恰好對那個特定調用是無害的。

噓!

*那么,“活動記錄”的怪誕到底是誰的主意?

where()這樣的函數在全局對象上排隊的事情是一個好主意嗎? 更好的設計不是讓每個SQL語句成為一個不同的對象,這樣構造一個錯誤時就不會在應用程序的完全不同的部分破壞另一個錯誤嗎?

暫無
暫無

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

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