繁体   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