分页参数传不进 paginate() 是因默认只识别 page 和 list_rows;需显式指定参数名或全局配置;模板路径、驱动类版本及 appends() 用法均影响分页效果。

分页参数传不进 paginate()?检查请求方式和参数名
ThinkPHP 的 paginate() 默认只认 page 和 list_rows 这两个 GET 参数,如果你用 /?p=2 或 /?size=10,它直接忽略,返回第 1 页默认条数。
解决方法是显式指定参数名:
- 在控制器里调用时加
['page' => input('p/d', 1), 'list_rows' => input('size/d', 15)] - 或全局配置
'page' => 'p', 'list_rows' => 'size'到config/paginate.php(TP6.1+ 支持) - 注意:TP6 默认不自动解析路由变量里的分页参数,
route/2这种写法不会被paginate()自动识别,必须手动传参
替换分页 HTML 模板但样式不生效?路径和继承关系要对得上
ThinkPHP 分页渲染走的是模板引擎,不是纯 PHP 字符串拼接。你改了 think\paginator\driver\Bootstrap 类,但页面还是老样子,大概率是没命中实际渲染的模板。
真实加载顺序是:view/paginate.html → 不存在则 fallback 到框架内置模板 → 再 fallback 到驱动类的 render() 方法。
立即学习“PHP免费学习笔记(深入)”;
- 确保自定义模板路径是
view/[theme_name]/paginate.html,且[theme_name]和当前使用的模板主题一致(如未设 theme,默认是view/paginate.html) - 模板里必须保留
{$page->render()}或等效的分页变量输出,否则连基础结构都不出来 - TP6.3+ 开始支持
setTemplate()动态指定模板路径,比放固定位置更灵活:$list->render(['template' => 'common/paginate'])
想改「上一页」「下一页」文字但 lastPage、nextPage 不起作用?看驱动类版本
TP6.0 之前用 Bootstrap 驱动,lastPage 和 nextPage 是有效配置项;但 TP6.1+ 默认换成了 Bootstrap4 驱动,这两个键名已失效,改用 prev_text 和 next_text。
常见错误是复制旧文档代码,结果文字死活不变。
- 确认当前驱动类型:
config('paginate.type')返回值是'bootstrap'还是'bootstrap4' - 对应配置项:
-
Bootstrap:用'last_page' => '上一页', 'next_page' => '下一页' -
Bootstrap4:用'prev_text' => '‹', 'next_text' => '›'(注意是英文符号,中文需手动改模板)
-
- 如果用了自定义模板,那这些配置项根本不起作用——所有文案都在 HTML 里硬编码,改配置没用
分页链接带多余查询参数?appends() 控制太粗放
默认 paginate() 会把当前 URL 所有 GET 参数都带到分页链接里,比如 ?keyword=php&sort=name&page=2,但你只想保留 keyword,不想让 sort 干扰分页逻辑。
别直接用 appends(input()),那等于全量继承;应该白名单过滤:
- 用
$page->appends(['keyword' => input('keyword')])显式传需要的 - 或者提前清理:
input('', '', false)获取无过滤的原始数组,再array_intersect_key()筛选 - 注意:TP6.2+ 支持
simple()模式,它默认不继承任何参数,适合做纯数字分页,但丢失搜索上下文
最麻烦的是混合场景:既要保留搜索条件,又要避免分页参数重复(比如同时存在 page 和 p),这时候得在生成链接前统一 normalize 参数名。



















