codeigniter 分页需手动调用数据库类配合 offset 和 limit 查询数据,分页类仅生成链接;总记录数须提前查询并传入配置,ci4 可直接用 paginate() 简化操作。

CodeIgniter 中分页查询数据时,limit 不需要手动拼接 SQL 字符串,而是通过框架提供的链式方法(如 limit() 和 offset())由系统自动处理,既安全又规范。
使用 $this->db->limit() 和 offset() 配合分页类
CodeIgniter 的分页类(Pagination)本身不执行查询,只生成页码链接;实际数据查询需你手动调用数据库类,并传入当前页码计算出的偏移量和每页条数:
- 先用
$this->pagination->initialize()配置分页参数(如总记录数、每页数量、URI 分段等) - 通过
$this->uri->segment(3)获取当前页码(假设页码在 URI 第 3 段),计算offset = (page - 1) * per_page - 查询时调用:
$this->db->limit($per_page, $offset)->get('table_name');
这会自动生成类似SELECT * FROM table_name LIMIT 10 OFFSET 20的 SQL(MySQL 5.7+ / 8.0)或兼容写法(如LIMIT 20, 10,取决于数据库驱动)
推荐:封装成可复用的分页查询方法
避免重复计算 offset,可把分页查询逻辑抽成模型方法:
- 模型中定义:
public function get_list($per_page = 10, $page = 0) {<br> $offset = $page ? ($page - 1) * $per_page : 0;<br> return $this->db->limit($per_page, $offset)->get('user')->result();<br>} - 控制器中调用:
$page = $this->uri->segment(3, 1);<br>$data['list'] = $this->user_model->get_list(15, $page);
注意 total_rows 必须提前查出
分页类依赖总记录数生成页码,必须在初始化前查询一次总数(不带 limit):
$total = $this->db->count_all_results('user', FALSE); // FALSE 表示不重置查询条件- 若之前已设置过
where()等条件,用count_all_results()更准确;否则可用count_all('user') - 确保
total_rows传给分页配置,否则页码可能错乱或只显示第 1 页
CI4 用户注意语法差异
如果你用的是 CodeIgniter 4,写法更简洁:
$users = $this->userModel->paginate(15, 'default', $page); // 自动处理 limit/offset- 配合
$pager = \Config\Services::pager();渲染页码,无需手动算 offset - CI4 的
paginate()底层已集成 count + limit + offset,推荐优先使用











