|
大家好,long time no see ,原本以为升级到 CodeIgniter v1.6.2 的最新版就好了,可还是有BUG的,今天俺就碰到了一次,具体情况如下.
比如你有这么两句
PHP复制代码 $this->db->where('archives.typeid', $tid);
$this->db->where('archives.iscommend >= ',$iscommend); 复制代码
嘿嘿,这时问题就出来了,如果你在配置文件中定义了表前缀的话,它生成的SQL语句中只会给archives.typeid这一个东东带前缀,而archives.iscommend 会原样输出,看似简单的一个问题实际上相当麻烦,在想这个问题这前我还是先想念了一下地震中的同胞,接下来我就苦苦的看代码了,发现问题出现在DB_active_rec.php的这个地方
PHP复制代码 if ($this->_has_operator ($k))
{
$k = preg_replace("/([A-Za-z_0-9]+)/", $this->_protect_identifiers ('$1'), $k);
}
else
{
$k = $this->_protect_identifiers ($k);
} 复制代码
此函数的功能就是检测where条件中带没带关系运算符. (什么!!你不知道什么是关系运算符,建议回家从幼儿园开始读),这个关系运算符就是指上面的 >= 这种东西.而且_protect_identifiers这函数还是在数据库抽象层文件里的,我也不想把文件改得太多,免得以后升级麻烦,由于我比较笨,是左思右想了两个钟头,突然之间眼前一亮,我才不管你怎么处理前缀的也,反正到后面我自己再重新处理一次就是,哈哈,顺着这个思路,修改了一点代码就OK得啦,下面请看
找到此东东PHP复制代码 $this->ar_where[] = $prefix.$k.$v; 复制代码 替换成下面这个小东东
PHP复制代码 //------------------------------------------------------------------- Jack add 用土办法解决 $this->db->where('archives.iscommend >= ',$iscommend); 这种情况时生成sql语句表名不加前缀bug
$plen = strlen($this->dbprefix);
if (substr($k,0,$plen)!=$this->dbprefix)
{
$k = $this->dbprefix . $k;
}
$this->ar_where[] = $prefix.$k.$v;
//------------------------------------------------------------------- 复制代码
在这高兴的时刻我又想念了一个地震中的同胞...
全文完 |
评分
-
查看全部评分
|