直接读取$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 已做过校验和归一化。
立即学习“PHP免费学习笔记(深入)”;
为什么不能只靠 $_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/>
<a href="{:U('index',array('p'=>$vo))}">{$vo}</a>
</eq>
</volist>
<p><!-- 首页按钮 -->
<eq name="$Page.nowPage" value="1">
<span class="disabled">首页</span>
<else>
<a href="{:U('index',array('p'=>1))}">首页</a>
</eq></p><p><!-- 尾页按钮 -->
<eq name="$Page.nowPage" value="$Page.lastPage">
<span class="disabled">尾页</span>
<else>
<a href="{:U('index',array('p'=>$Page.lastPage))}">尾页</a>
</eq>关键是把 $Page 对象 assign 进模板:$this->assign('Page', $Page),否则模板里访问不到 $Page.nowPage。



















