CodeIgniter 没有 paginate() 函数,需通过继承 MY_Pagination 类或手写 SQL+LIMIT/OFFSET 实现分页;CI 3.x 用 CI_Pagination,CI 4.x 改用 Pager 类,不可混用。

CodeIgniter 里不能直接用 paginate() —— 它压根不存在
CodeIgniter 没有叫 paginate() 的原生函数。你搜到的多数“扩展翻页”教程,其实是在改写或包装 CI_Pagination 类,或者绕过它直接手写 SQL + LIMIT/OFFSET。真想“扩展原生 PHP 翻页函数”,得先明确:PHP 本身也没有内置翻页函数——翻页是业务逻辑,不是语言特性。
所以实际要做的,是让 CI 的分页类更灵活,或在不破坏原有机制的前提下注入自定义行为:
-
CI_Pagination是可继承、可替换的,不是硬编码进核心的 - 它的渲染逻辑(
create_links())返回的是 HTML 字符串,不是模板引擎输出,方便截取/重写 - 分页参数(如
per_page、uri_segment)全靠配置数组传入,没魔法值
替换 CI_Pagination 类的两种安全方式
不要直接改 system/libraries/Pagination.php —— 升级就丢。正确做法是放本地扩展目录,再通过 application/config/autoload.php 或手动加载生效:
- 把修改后的类放在
application/libraries/MY_Pagination.php,类名必须是MY_Pagination,且继承CI_Pagination - 若需彻底替换(比如加 JSON 输出支持),可在
application/core下新建Pagination.php,类名仍为Pagination,但需继承原始类并重写关键方法 - 注意:CI 3.x 和 4.x 的类结构差异大;CI 4 用
Pager类替代了Pagination,路径和调用方式完全不同,别混用
在 create_links() 里加自定义 HTML 结构
很多人卡在“怎么让分页显示成 Bootstrap 5 样式”或“怎么把总条数塞进文字里”。这不是配选项能解决的,得动 create_links() 的输出逻辑:
立即学习“PHP免费学习笔记(深入)”;
- 原始方法返回的是纯字符串,你可以用
str_replace()或正则临时修补,但不推荐——维护性差 - 更好的做法:在
MY_Pagination中重写create_links(),把$this->first_tag_open这类属性留作钩子,再拼接你想要的<nav><ul class="pagination">...</ul></nav> - 如果需要带“共 X 条,第 Y 页”文字,别塞进链接里,而是在控制器中额外传参:
$data['pagination_info'] = "共 {$total_rows} 条,当前第 {$current_page} 页";
手写分页时如何复用 CI 的 URI 和数据库逻辑
有时你就是不想用 CI_Pagination——比如要做无限滚动、搜索条件复杂、或要合并多个查询结果。这时候可以跳过它,但别丢掉 CI 的便利:
- 用
$this->uri->segment(3)拿当前页码,比$_GET['page']更安全(尤其开启 query string 禁用时) - 计算总条数仍可用
$this->db->count_all_results()(记得先 clone 查询对象,避免 OFFSET/LIMIT 干扰) - 生成页码 URL 推荐用
$this->pagination->create_url($page)(即使不用它的 HTML,这个方法仍可用) - 切记:手写分页容易漏掉边界检查,比如
$page < 1或$page > $total_pages,得自己redirect()或设默认值
真正麻烦的不是写几行 LIMIT,而是保持和 CI 路由、缓存、安全过滤的一致性。一旦开始手写,就要对 $this->input->get() 做严格验证,否则 SQL 注入风险比用原生类还高。



















