直接读取$page->nowpage和$page->lastpage即可获取当前页码与总页数,二者在page实例化时已通过get参数校验和ceil($count/$listrows)计算完成,无需额外查库或手动计算。

直接看 $Page->nowPage 和 $Page->lastPage 就行,不需要额外查数据库或手动算总页数。
怎么拿到当前页和总页数
ThinkPHP 的 Page 实例初始化后,两个关键属性就已确定:
-
$Page->nowPage是当前页码(从 1 开始),由$_GET参数解析而来,无效时自动 fallback 到 1 -
$Page->lastPage是总页数,由ceil($count / $listRows)算出,$count来自你传入的总记录数
所以判断逻辑极简:
if ($Page->nowPage == 1) {
// 是第一页
}
if ($Page->nowPage == $Page->lastPage) {
// 是最后一页
}
注意:不要用 $_GET['p'] 或 $_GET['page'] 原始值比对,它可能非法、为空或超出范围;$Page->nowPage 已做过校验和归一化。
为什么不能只靠 $_GET 判断第一页
常见错误是写成 $_GET['p'] == 1,这会漏掉三种情况:
- URL 根本没带参数(如访问
/list),$_GET['p']未定义,直接报 Notice - 参数是字符串
'01'或'1.0',松散比较可能成立,但语义错误 - 参数超出总页数(比如总页数是 5,却传了
p=10),$Page内部会自动设为lastPage,但$_GET还是 10
$Page->nowPage 是唯一可信的当前页标识,它在 Page 构造时就完成了类型转换、越界修正和默认值填充。
最后一页判断失效的典型场景
你以为 $Page->nowPage == $Page->lastPage 总是可靠?其实有个隐藏前提:
- 你传给
Page构造函数的$count必须准确——如果缓存了过期的总数,$lastPage就会错 - 分页查询用了
limit+where,但$count查询的where条件和主查询不一致(比如少了个 status=1),会导致$lastPage偏大 - 启用了游标分页(
cursorPaginate())——它压根不依赖lastPage,此时$Page->lastPage是 0 或无意义值,必须改用hasMore或检查返回数据量是否满页
也就是说:基于 lastPage 的判断只适用于传统 offset 分页,且要求 count 查询与数据查询条件完全镜像。
模板里怎么安全显示「首页/尾页」按钮
在 ThinkPHP 模板中,别用 {$Think.get.p} eq 1 这类写法。正确姿势是:
<volist name="pageList" id="vo"><eq name="vo" value="$Page.nowPage"><span class="current">{$vo}</span>
<else></else><a href="%7B:U('index',array('p'=>%24vo))%7D">{$vo}</a>
</eq></volist><p><!-- 首页按钮 -->
<eq name="$Page.nowPage" value="1"><span class="disabled">首页</span>
<else><a href="%7B:U('index',array('p'=>1))%7D">首页</a>
</else></eq></p><p><!-- 尾页按钮 -->
<eq name="$Page.nowPage" value="$Page.lastPage"><span class="disabled">尾页</span>
<else><a href="%7B:U('index',array('p'=>%24Page.lastPage))%7D">尾页</a>
</else></eq></p>
关键是把 $Page 对象 assign 进模板:$this->assign('Page', $Page),否则模板里访问不到 $Page.nowPage。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











