thinkphp5.1分页需手动保留非page参数,通过paginate()的query选项传入request()->except('page')等参数,确保{$list->render()}生成带完整参数的链接,避免使用appends()或links()。

ThinkPHP5.1分页时默认只保留page参数,其他URL参数(比如搜索关键词keyword、分类cid、排序order等)会丢失。解决方法是在调用分页对象的render()前,手动追加需要保留的参数。
在控制器中设置分页并追加参数
使用appends()方法将当前请求中的有效参数传入分页对象:
- 推荐直接用
input()获取全部GET参数,再剔除page(避免重复) - 也可以显式指定需保留的键名,更安全可控
示例代码:
$list = Db::name('article')
->where($where)
->paginate(10, false, [
'query' => array_merge(
request()->except('page'), // 保留除 page 外的所有 GET 参数
['_pjax' => input('_pjax')] // 如有 PJAX 等特殊参数可额外追加
)
]);
$this->assign('list', $list);
模板中正确渲染分页
无需额外处理,只要分页对象已通过query选项携带了参数,{$list->render()}就会自动生成带完整参数的分页链接。
- 确保模板里调用的是
{$list->render()},不是{$list->links()}(后者是旧版写法,不支持自动继承 query) - 若用了自定义分页模板,需确认其中的链接使用了
$page->url($i)而非硬编码 URL
常见遗漏点和注意事项
有些情况容易导致参数“看似追加却无效”,要注意:
-
不要在
paginate()之后再调用appends():TP5.1中paginate()返回的是Paginator实例,它没有appends()方法;必须通过query参数传入 - 中文或特殊字符参数要确保 URL 编码正常,TP 默认会处理,但若手动拼接
query数组,应避免用urlencode()二次编码 - 如果用了路由伪静态(如
list/2.html),需确认路由规则未截断查询字符串,必要时在路由定义中启用complete_match或改用兼容模式
不复杂但容易忽略。关键就是把非 page 的参数塞进paginate的query配置项里,框架会自动注入到每一页链接中。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











