CodeIgniter - $this->db->from 没有将 'from x_table' 添加到最终查询,在站点的完整导航上多次失败

CodeIgniter - $this->db->from did not add 'from x_table' to final query, failed several times over full navigation of site

我今天看到一些非常奇怪的行为,我不知道该怎么办。我们在我们的网站上使用 codeigniter 已经一年多了,今天当我点击我们的一个页面时,我看到一个数据库错误显示给我。我迅速打开该页面的控制器并刷新以再次看到它,但这次没有发生,我无法让它再次在那里触发。

嗯,令人震惊。

我导航到其他几个页面,在另一个页面上又发生了,这次我查看了它失败的地方,它死于这样的查询:

SELECT `foo`.`ID_NO` JOIN `bar` ON `bar`.`foo_ID` = `foo`.`ID_NO` WHERE `someSetting` = 0 AND `bar`.`Filter_ID` = '123'

...等一下,应该在里面的'FROM foo'在哪里?

我查看了我的模型控制器,它尝试执行以下代码行:

$this->db->select("foo.ID_NO");
$this->db->from('foo');
$this->db->join('bar','bar.foo_ID = foo.ID_NO');

此代码已运行一年,以前从未在任何地方发生过这样的错误。它看起来很像“$this->db->from('foo');”根本就没有发生。

我导航到网站上的许多其他页面,它又发生了几次,同样的问题是没有正确构建查询并抛出数据库错误。刷新后,错误总是消失。我没有在任何页面上看到重复,也没有看到页面通过然后在稍后失败。

有两件事可能是一个因素:首先,我最近添加了一个 error/exception 处理程序(但这不应该对此产生影响,尤其是一次之后就不再如此我可以告诉)。

其次,当我开始使用 error/handler 时,我在 CodeIgniters 中发现了一个已知的错误,并通过将 Common.php 中的 "function is_loaded($class = '')" 更改为 "function &is_loaded($class = '')" 来修复,因为Loader.php 中发生的错误:“$this->_base_classes =& is_loaded();”。该修复程序似乎已被广泛接受,我遇到的错误不可重复且似乎不相关,所以我也不认为这是原因。

我使用的是 CodeIgniter 2.1.2 版。有没有人见过这样的事情?我无法想象这是什么原因,但我不希望它发生在我今天看到的开发环境之外。

编辑:此外,我提到的我喜欢的新错误记录系统没有记录 db->from 函数中出现的任何错误:(

原因是我的错误捕捉器由于引用了不存在的索引而被触发:

if($post_array['query'] != ""){

然后错误记录器收集了它的信息并插入到数据库中。我猜想当您以这种方式插入时它使用相同的 $this->db->ar_from 字段:

$this->db->insert('error_logging', $data);

然后像任何成功查询后一样清除它。

然后代码返回到之前的位置,ar_select、ar_like 等字段完好无损,但 ar_from 并移至 $this->db-> get() 命令失败。

在随后的页面加载中,错误已经记录在数据库中,因此没有执行新的插入,查询构建器也没有被篡改,因此没有新的数据库错误。

修复方法是简单地获取 $this->db 的克隆并使用该克隆来执行插入。