CI1升级CI3后CRUD的LIMIT功能失效问题咨询
问题原因与解决方案
这个问题我太熟悉了!本质是CodeIgniter 3对查询构建器的行为做了改动,和CodeIgniter 1的逻辑不一样导致的。
核心原因
在CodeIgniter 3中,get_compiled_select()方法默认会重置查询构建器的所有状态——包括你之前设置的limit()、offset()、where()这些条件!而在CodeIgniter 1里,调用编译查询的方法不会清空这些条件,所以之前的代码能正常工作。
你现在的代码流程是:
- 设置了
limit()和offset() - 调用
get_compiled_select(),此时默认重置了查询构建器,LIMIT条件被清空 - 再调用
get(),这时候查询已经没有LIMIT限制了,自然失效
解决方法
只需要在调用get_compiled_select()的时候传入FALSE参数,阻止它重置查询构建器即可:
$this->db->limit($options['limit'], $options['offset']); // 传入FALSE,不让方法重置查询条件 $compiled_sql = $this->db->get_compiled_select(FALSE); print($compiled_sql); $query = $this->db->get();
额外说明
CodeIgniter 3这么设计是为了避免查询构建器的状态污染——比如你复用同一个$this->db实例构建多个查询时,默认重置能防止之前的条件干扰新查询。但这个改动和CI1的行为不一致,就容易给升级的开发者埋坑。
如果之后你需要复用查询构建器,记得手动调用$this->db->reset_query()来清空状态,避免意外问题。
内容的提问来源于stack exchange,提问作者Kevrone
相关产品推荐
相关产品推荐

