查看完整版本: [1.6.2]CodeIgniter 修复where条件不能生成前缀的BUG

Jack 2008-5-16 16:34

[1.6.2]CodeIgniter 修复where条件不能生成前缀的BUG

大家好,long time no see ,原本以为升级到   [url=http://codeigniter.org.cn/forums/thread-567-1-1.html][color=#000000]CodeIgniter v1.6.2 [/color][/url]的最新版就好了,可还是有BUG的,今天俺就碰到了一次,具体情况如下.
比如你有这么两句
[code=PHP]$this->db->where('archives.typeid', $tid);
$this->db->where('archives.iscommend >= ',$iscommend);[/code]
嘿嘿,这时问题就出来了,如果你在配置文件中定义了表前缀的话,它生成的SQL语句中只会给archives.typeid这一个东东带前缀,而archives.iscommend 会原样输出,看似简单的一个问题实际上相当麻烦,在想这个问题这前我还是先想念了一下地震中的同胞,接下来我就苦苦的看代码了,发现问题出现在DB_active_rec.php的这个地方
[code=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);
     }[/code]
此函数的功能就是检测where条件中带没带关系运算符.  (什么!!你不知道什么是关系运算符,建议回家从幼儿园开始读),这个关系运算符就是指上面的 >= 这种东西.而且_protect_identifiers这函数还是在数据库抽象层文件里的,我也不想把文件改得太多,免得以后升级麻烦,由于我比较笨,是左思右想了两个钟头,突然之间眼前一亮,我才不管你怎么处理前缀的也,反正到后面我自己再重新处理一次就是,哈哈,顺着这个思路,修改了一点代码就OK得啦,下面请看

找到此东东 [code=PHP]$this->ar_where[] = $prefix.$k.$v;[/code]   替换成下面这个小东东
[code=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;
//-------------------------------------------------------------------[/code]


在这高兴的时刻我又想念了一个地震中的同胞...

[size=6][color=darkorange][b]全文完[/b][/color][/size]

Jack 2008-5-19 09:06

帮忙顶一下好,好东西不能沉了.
页: [1]
查看完整版本: [1.6.2]CodeIgniter 修复where条件不能生成前缀的BUG