CodeIgniter分页需同步设置per_page配置和手动limit查询:per_page仅用于分页计算,不自动影响SQL;数据库查询必须用limit($per_page,$offset)且条件构建需完全一致,否则导致页码错乱或数据重复。

CodeIgniter 分页查询的条数控制,本质是两件事:一是告诉分页类「每页显示多少条」,二是让数据库查询「实际只取这么多条」。漏掉任一环节,都会导致页面显示条数不对、页码错乱或数据重复。
per_page 配置必须显式传给 pagination->initialize()
分页类本身不干预数据库查询,per_page 只用于计算总页数、生成链接,不会自动加到 SQL 里。如果你只设了 $config['per_page'] = 20 却没在查询时用这个值做 limit,那数据库还是默认查全部或沿用旧 limit。
-
$config['per_page']必须是整数且 > 0;设为 0 或负数时,分页类静默失效,只显示第一页内容 - 不要写成
$config['page_size']或其他键名——CI 只认per_page - 若需动态值(如 URL 参数
_pp=15),务必先校验范围:$perpage = max(5, min(100, (int)$this->input->get('_pp')))
数据库查询必须手动调用 limit($per_page, $offset)
CI 的 limit() 方法是唯一可靠的方式,且参数顺序不能颠倒:$this->db->limit($num, $offset)。常见错误是把 $offset 当作页码传进去,或漏算偏移量。
-
$offset必须是($page - 1) * $per_page(use_page_numbers = TRUE时)或直接从 URI 段取(如$this->uri->segment(3)) - 不要用原始 SQL 拼接
limit $offset, $per_page——绕过 Query Builder 会丢失 WHERE 条件上下文,尤其在多条件搜索时极易总数/列表不一致 - Model 中封装查询时,确保
limit()调用在where()、like()等条件之后,否则条件可能被忽略
总数统计 count_all_results() 必须复用完全相同的查询条件
这是最容易出错的地方:查总数和查列表用了不同 WHERE,导致页码跳转后数据错位、最后几页空白。CI 的 count_all_results() 会复用当前 Query Builder 的所有条件,但前提是——你没中途调用 get() 或 _reset_select()。
- 先构建完整条件(
where、like、join等),再调count_all_results()得总数,接着调limit()->get()得分页数据 - 避免链式调用中混用
paginate()和countAllResults()(CI4 常见坑),CI3 必须拆成两个独立查询 - 如果 Model 里用了
$this->db->from('table')覆盖了之前join,总数和列表的表关联就断了——检查是否误触_reset_select()
真正卡住人的往往不是语法,而是「总数查询和分页查询是否共享同一套条件快照」。只要中间有一次 get()、from() 或 _reset_select(),条件就丢了。建议把条件构建抽成独立方法,在总数和列表查询前各调一次。


















