大家好,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;
//------------------------------------------------------------------- 在这高兴的时刻我又想念了一个地震中的同胞...
全文完