Php 活动记录中的额外附带条件WHERE子句:它们来自哪里?

Php 活动记录中的额外附带条件WHERE子句:它们来自哪里?,php,mysql,codeigniter,activerecord,Php,Mysql,Codeigniter,Activerecord,当我正在使用的CodeIgniter应用程序试图执行特定的更新操作时,我遇到了一个非常奇怪的数据库错误 活动记录呼叫是: $this->db->update('eval_events', array('eval_event_totalscore'=>$result['average_score'], 'eval_event_average_totalscore=>$result['aver

当我正在使用的CodeIgniter应用程序试图执行特定的更新操作时,我遇到了一个非常奇怪的数据库错误

活动记录呼叫是:

$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'
嗯?那些涉及到“身份”的额外事件到底是从哪里来的

很明显,我没有通过这些考试,我对CI_active_record.php的阅读也没有给我任何线索

另外三条可能相关的信息:

据我所知,这种失败只发生在我的开发机器上。在生产机器上的查询似乎很好。 如果我注释掉这个更新调用,下面的更新调用将以完全相同的方式损坏。 值“581”在这些更新所属的操作的整体上下文中很重要,但它是另一个表中的键,并且无论如何,它绑定到名为“pid”的列,而不是“id”的列。 这感觉像是活动记录代码缓存了'id`=“581',某种原因导致它在此时将缓存的内容输出到我的UPDATE语句中

我承认,我不明白Active Record的start\u cache/stop\u cache/flush\u cache方法到底适合做什么——但这不重要,因为grep-r告诉我,在应用程序的代码库中任何地方都没有启动\u cache的调用

为了让大家开心,我尝试在更新调用失败之前立即调用$this->db->flush\u缓存,但没有改变任何事情

我不知道下一步该去哪里寻找答案

有什么想法吗?有人吗?

好的:echo、var\u导出和调试\u打印\u返回救援

事实证明,在进行失败的更新调用之前,有一个函数总共被调用了16次。16恰好是bad 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();
这幅画怎么了

好的,除了使用活动记录这一可疑的选择之外,*活动记录查询方法不使用以前调用where时隐藏的任何内容

因此,这16个虚假条件的队列仍在等待连接到第一个毫无防备的更新或选择,或任何出现的调用

为什么生产系统上不也会发生这种情况

嗯,在我的开发系统上,我暂时注释掉了一些我并不真正关心的东西,因为我的本地PHP中缺少了一些配置,我当时不想重建

显然,无论我注释了什么,都包含了一个活动记录调用,该调用将16个条件强加给了队列,但对于那个特定的调用,它们恰好是良性的

*那么,这场活跃唱片的闹剧到底是谁的主意呢

在全局对象上使用诸如在何处排队之类的函数是一个好主意?更好的设计不是让每个SQL语句都成为不同的对象吗?这样,在构建一个SQL语句时犯的错误就不会损坏应用程序完全不同部分中的另一个SQL语句了