thinkphp5分页必须最后调用paginate(),不可前置limit/order;需传关联数组配置参数;模板中须用$pages->render()输出html;field()应保留主键以防count出错。

ThinkPHP5 的分页不能直接在 where 查询后链式调用 paginate() 就完事——它默认会执行两次 SQL(一次查总数,一次查数据),而如果你手动写了 limit 或用了 order 但没传进分页方法,很容易漏数据或错乱。
分页方法必须放在查询构造的最后一步
ThinkPHP5 的 paginate() 是一个“终结方法”,它会接管整个查询逻辑。一旦你在它之前用了 limit()、page() 或手动拼了 ORDER BY,分页就失效或报错。
- ✅ 正确:先写条件,最后统一交给
paginate()处理 - ❌ 错误:
->where(...)->limit(10)->paginate(15)——limit()会干扰分页自动计算 - ⚠️ 注意:
paginate(15)中的15是每页条数,不是总页数
自定义分页参数要传数组,别传字符串
想改当前页码、每页数量、URL 参数名?必须用关联数组传给 paginate(),传字符串(比如 '?page=2')会被忽略。
- 常见需求写法:
paginate(['page' => input('param.page/d', 1), 'list_rows' => 20]) -
list_rows对应每页数量;page指定当前页(不传则自动从$_GET['page']读) - URL 参数名默认是
page,如需改成p,加'var_page' => 'p' - 如果启用了 URL 路由且带参数(如
/news/index/p/2),确保路由变量和var_page一致
模板里渲染分页 HTML 必须用 render(),不是直接 echo 变量
控制器里赋值给模板的是一个 Paginator 对象,不是 HTML 字符串。直接 {$pages} 输出的是对象地址或空,必须显式调用 render()。
- 模板中正确写法:
{$pages->render()} - 若想自定义分页样式,可用
simple()方法:{$pages->simple()->render()}(无首页/末页,仅上一页/下一页) - 分页对象提供常用属性:
$pages->currentPage()、$pages->lastPage()、$pages->total() - 注意:开启调试模式时,分页 SQL 会在日志里打两次(COUNT + SELECT),这是正常行为,不是 bug
最常被忽略的一点:如果你在查询中用了 field() 且字段里没包含主键,分页的 COUNT 查询可能因缺少主键导致 GROUP BY 错误或结果不准;确保 field() 至少保留主键字段,或者干脆不用 field() 让 TP 自动处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











