Codeigniter3中Limit与Offset分页失效问题求助
解决CodeIgniter3 Ajax分页每次返回全部数据的问题
你遇到的问题很典型——分页组件显示正常,但每次请求都拿到全部12条数据,核心原因是模型里的查询构造器调用顺序错了,导致分页的limit和offset根本没生效。
先看你模型里的这段代码:
public function get_collections($id = FALSE, $limit = FALSE, $offset = FALSE) { if ($id === FALSE) { $query = $this->db->get('collections'); // 这里先执行了查询! $this->db->order_by('id','desc'); if($limit && $offset){ $this->db->limit($limit,$offset); }elseif(!$offset && $limit){ $this->db->limit($limit); } return $query->result_array(); } // ... 其他代码 }
问题出在$this->db->get('collections')这行:你先执行了查询,之后才设置order_by和limit条件,这些条件根本没被加到查询语句里,所以每次都是返回全表数据。
修复方案:调整查询构造器的调用顺序
要先把所有查询条件(排序、分页)都设置好,最后再调用get()执行查询。修改后的模型代码如下:
public function get_collections($id = FALSE, $limit = FALSE, $offset = FALSE) { if ($id === FALSE) { $this->db->order_by('id','desc'); // 先设置排序 // 再设置分页条件 if($limit && $offset){ $this->db->limit($limit,$offset); }elseif($limit){ // 简化判断,只要有limit就设置 $this->db->limit($limit); } $query = $this->db->get('collections'); // 最后执行查询 return $query->result_array(); } $query = $this->db->get_where('collections', array('id' => $id)); return $query->row_array(); }
额外优化建议
控制器里计算总条数的count($this->collections_model->get_collections())会查询全表数据再计数,效率较低,建议改用CodeIgniter内置的计数方法:
// 替换原来的$totalRec = count($this->collections_model->get_collections()); $totalRec = $this->db->count_all_results('collections');
这样直接执行SELECT COUNT(*) FROM collections,性能更好。
改完之后,再测试Ajax分页,应该就能每次只返回当前页的1条数据了。
内容的提问来源于stack exchange,提问作者user9659355
相关产品推荐
相关产品推荐

