ci4分页总显示第一页,根本原因是uri_segment配置与url结构不匹配:/news/5需设uri_segment=2,?page=2需启用page_query_string=true,且paginate()与countallresults()必须拆分为两个独立查询。

CI4 分页为什么总显示第一页?
根本原因是 uri_segment 配置和实际 URL 结构不匹配,CI4 默认从 URI 第三段取页码(比如 /news/page/2),但你可能用的是 /news/2 或 ?page=2。
- 确认当前 URL 路径:访问
/news/5时,页码在第 2 段 → 设$config['uri_segment'] = 2 - 用 GET 参数(
?page=2):必须启用$config['page_query_string'] = TRUE,此时uri_segment失效,页码从$_GET['page']读 - 控制器方法签名是
public function index($page = 1):页码由函数参数传入,应设$config['uri_segment'] = 0,并开$config['use_page_numbers'] = TRUE - 漏掉
$this->pager传递给视图,或视图里没写= $pager->links() ?>,链接压根不会渲染
搜索分页总数老对不上,怎么修?
不是配置问题,是查询构建器状态被污染——paginate() 和 countAllResults() 不能链式调用,前者加了 LIMIT/OFFSET,后者再执行就查错范围。
- 必须拆成两个独立查询:先用完全相同的条件查总数,再用相同条件查分页数据
- 示例写法:
$total = $builder->orLike('title', $q)->orLike('content', $q)->countAllResults();,然后重置构建器或新建一个:$results = $builder->orLike('title', $q)->orLike('content', $q)->paginate(10); - 别用
$builder->select('*')->orLike(...)->paginate(10)->countAllResults(),这一定错 - 如果用了
JOIN或GROUP BY,countAllResults()默认不带这些,得手动补全条件,否则总数少算
怎么让分页链接适配 Bootstrap 5?
CI4 的 $pager 默认输出裸 HTML,class 名和结构和 Bootstrap 5 不兼容,直接套 class 会失效。
- 在视图中调用
$pager->setTemplate(['default' => 'your_custom_pager']),模板文件里写纯 HTML + Bootstrap 5 的pagination结构 - 关键字段映射:
first_link对应 Bootstrap 的「首页」按钮,next_link建议写成<span aria-hidden="true">»</span>,避免文字干扰 - 不要动
$pager->only()以外的内部方法,CI4 的 Pager 类不开放链式修改接口 - 若用 Tailwind 或自定义 CSS,直接覆盖
pager_links模板里的<ul class="..."></ul>即可,不用改 PHP 配置
列表展示时字段名大小写/下划线搞混了怎么办?
CI4 查询构建器默认字段名原样输出,但数据库列是 created_at,前端 DataTables 写成 createdAt,就会静默失效——排序、搜索、筛选全崩,还不报错。
- 要么统一用下划线命名:数据库、SELECT 别名、前端
columns.data全写created_at - 要么 SELECT 时显式别名:
$builder->select('created_at as createdAt'),确保返回数组键名和前端一致 - Model 层若用了
protected $allowedFields,它不影响查询字段输出,只管写入;字段映射纯靠 SELECT 和前端对齐 - 调试时 dump 出 JSON 响应,看实际返回的 key 是什么,别猜
最麻烦的从来不是写分页代码,而是让总数、页码、URL、前端字段四者严丝合缝——差一个下划线,整个搜索分页就哑火,而且毫无提示。











