Jack 发表于 2008-5-16 16:34:08

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

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

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


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

全文完

Jack 发表于 2008-5-19 09:06:21

帮忙顶一下好,好东西不能沉了.

tboqi 发表于 2009-1-4 14:50:44

我觉得还是用原生的sql比较好啊,因为可以直接copy sql 到命令看sql是否正确

各位能否说说用 activerecode 有什么好处

Hex 发表于 2009-1-4 15:14:24

简单封装 SQL 而已,实际上 AR 很简单,如果是真正的 ORM 就应该很有价值了。

tboqi 发表于 2009-1-5 22:31:42

我总觉得用ar的时候,多表查询不好弄,实际应用里面我单表的话我用ar,多表我用sql
页: [1]
查看完整版本: [1.6.2]CodeIgniter 修复where条件不能生成前缀的BUG