应通过分页器实例的currentpage()方法获取当前页码,如$list->currentpage(),因其已校验并标准化页码;避免使用input('page')或tp5.1的getcurrentpage(),以防参数污染或类型错误。

ThinkPHP 6.x 中如何正确获取当前页码
在 ThinkPHP 6 中,input('page') 不是可靠方式——它可能被手动篡改、未经过滤,且与分页器实际使用的页码不一致。真正安全、准确的页码应从分页器实例中提取。
分页器(如 paginate() 返回的对象)内部已解析并校验过页码,调用其 currentPage() 方法即可拿到经合法性检查后的当前页数值。
- 直接使用
$list->currentPage(),其中$list是paginate()返回的结果对象 - 不要依赖
input('page', 1, 'intval')做判断,它绕过了分页器的页码标准化逻辑(比如负数转 1、超限值截断等) - 若需在模板中显示当前页,可直接写
{$list->currentPage()}(TP6 模板语法)
ThinkPHP 5.1 分页对象里取页码的注意事项
TP5.1 的分页对象没有 currentPage() 方法,得用 getCurrentPage(),且该方法返回的是原始请求参数,未做类型转换。
- 必须手动过滤:例如
$page = (int) $list->getCurrentPage(); $page = $page - 注意:TP5.1 的
getCurrentPage()可能返回字符串或 null,不加转换直接参与运算会出错 - 如果用了自定义分页类(如继承
Think\Paginator\Driver\Bootstrap),页码仍以getCurrentPage()为准,不是input()
为什么不能直接用 $_GET['page'] 或 input('page')
绕过分页器直接读取原始参数,等于放弃框架内置的页码容错机制,极易引发越界、SQL 注入(当页码参与 limit offset 计算时)、空数据或 500 错误。
- 分页器会对页码做三重处理:非数字转 1、负数转 1、超过最大页数时自动设为最后一页
-
input('page')在未设置默认值时可能返回空字符串,强制转 int 会得 0,导致offset 0但limit 0,查不出任何数据 - URL 中带
?page=abc时,input('page', 1)返回 'abc',而分页器早已将其归一为 1
分页后想在 JS 里拿到当前页怎么办
服务端渲染模板时,把 $list->currentPage() 注入到页面变量中是最稳妥的方式,避免前端再解析 URL。
- 模板中写:
<script>const currentPage = {$list->currentPage()};</script> - 不要让 JS 去正则匹配
window.location.search,URL 可能含多个 page 参数、编码问题、或根本没 page(首页) - 若走纯 API 分页(如返回 JSON),确保接口响应体里包含
"current_page": 3字段,和列表数据同级
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











