用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5237|回复: 4
收起左侧

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

[复制链接]
发表于 2008-5-16 16:34:08 | 显示全部楼层 |阅读模式
大家好,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;
//-------------------------------------------------------------------
复制代码



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

全文完

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

 楼主| 发表于 2008-5-19 09:06:21 | 显示全部楼层
帮忙顶一下好,好东西不能沉了.
发表于 2009-1-4 14:50:44 | 显示全部楼层
我觉得还是用原生的sql比较好啊,因为可以直接copy sql 到命令看sql是否正确

各位能否说说用 activerecode 有什么好处
发表于 2009-1-4 15:14:24 | 显示全部楼层
简单封装 SQL 而已,实际上 AR 很简单,如果是真正的 ORM 就应该很有价值了。
发表于 2009-1-5 22:31:42 | 显示全部楼层
我总觉得用ar的时候,多表查询不好弄,实际应用里面我单表的话我用ar,多表我用sql

本版积分规则