首页判断应先过滤再比较:$page = (int)filter_input(input_get, 'page', filter_sanitize_number_int); $is_first = ($page

如何用 $_GET['page'] 判断当前是否为首页
PHP 翻页逻辑里,首页通常对应 page=1(或无 page 参数),但直接用 $_GET['page'] === '1' 有风险:比如用户传入 page=01、page=1.0 或空字符串,都可能绕过判断。更稳妥的方式是先过滤再比较:
- 用
filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT)提取纯数字 - 强制转为整型后判断是否等于
1 - 若参数不存在或过滤后为
0,也应视作首页(常见于省略page=1的 SEO 友好写法)
$page = (int) filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT);
$is_first = ($page <p>注意:不要用 <code>empty($_GET['page'])</code>,因为 <code>page=0</code> 是合法页码(尽管少见),而 <code>empty('0')</code> 会返回 <code>true</code>。</p><h3>怎样安全判断是否为尾页(末页)</h3><p>尾页取决于总数据量和每页条数,不能只看 URL 参数。典型做法是先查总数(如 <code>$total = $pdo->query("SELECT COUNT(*) FROM ...")->fetchColumn();</code>),再算出最大页码:</p>
$last_page = (int) ceil($total / $per_page);- 再比对
$page === $last_page
常见疏漏点:
- 没做
$total是否为0的保护,导致ceil(0 / $per_page) === 0,尾页变成0 - 用整除(
$total / $per_page)代替ceil(),当$total不能被整除时结果偏小 - 忘记把
$page限制在合理范围(比如$page > $last_page时应重定向或显示 404)
$last_page = $total > 0 ? (int) ceil($total / $per_page) : 1; $is_last = ($page >= $last_page && $last_page > 0);
is_first 和 is_last 在分页链接生成中的实际用法
判断结果主要影响「上一页」「下一页」按钮的禁用状态和链接渲染:
- 首页时,「上一页」应为禁用态(
class="disabled")或不带href,且不输出链接 - 尾页时,「下一页」同理
- 但注意:即使
$is_first为真,仍要保留首页链接本身(比如「1」这个数字链接),只是「上一页」不可点
示例片段(精简逻辑):
<a href="?page=<?=%20max(1,%20%24page%20-%201)%20?>" class="disabled" :>>上一页</a> <a href="?page=<?=%20min(%24last_page,%20%24page%20+%201)%20?>" class="disabled" :>>下一页</a>
关键点:链接 href 仍要生成有效地址(避免 ?page=0),所以用 max(1, ...) 和 min($last_page, ...) 做兜底。
为什么不能只依赖 $_GET 做尾页判断
单纯检查 $_GET['page'] 是否等于某个固定值(比如硬编码 10)完全不可靠:
- 数据增删后总条数变化,尾页页码必然变动
- 分页大小(
$per_page)可能随设备、用户偏好或 A/B 测试动态调整 - 后端接口或缓存策略可能导致同一 URL 返回不同数据量
真实项目中,尾页判断必须基于实时或准实时的 $total 计算,且该值最好与后续数据查询共用同一个条件(WHERE 子句一致),否则会出现「点击尾页却查不到数据」的错位。
最易被忽略的是:计算 $last_page 的 $total 查询,没加和主查询完全一致的 WHERE 条件(比如漏了权限过滤、软删除标记等),导致分页器显示有第 5 页,但点进去发现没数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











