PHP分页需安全获取页码、计算偏移量并条件渲染链接:用is_numeric()校验再转整型,或max/min约束范围;$offset=($page>0)?($page-1)*$limit:0;当前页数字不加链接,“上一页”仅$page>1时显示,“下一页”需判断是否末页。

在PHP分页逻辑中,需动态计算当前页码、总页数、起始条目偏移量等数值,同时避免非法页码(如0、负数、超出范围的页码)导致SQL错误或空白结果。直接用if-else嵌套易冗长,三元运算符可压缩关键判断路径,但必须兼顾可读性与边界安全。
安全获取当前页码
从$_GET['page']取值时,未过滤可能引发Notice或SQL注入风险,不能直接用intval()粗暴转换。
方法一:单层三元+类型校验
使用is_numeric()排除字符串如'abc'或'1.5',再强制转为整型:$page = (is_numeric($_GET['page']) && (int)$_GET['page'] > 0) ? (int)$_GET['page'] : 1;
方法二:默认兜底+范围约束
先设默认值,再用三元限制上限——若总页数已知为$totalPages,则:$page = isset($_GET['page']) ? max(1, min((int)$_GET['page'], $totalPages)) : 1;
注意:min()和max()组合比单独三元更稳妥,避免写成$_GET['page'] > $totalPages ? $totalPages : $_GET['page']这种漏判非数字的情况。
立即学习“PHP免费学习笔记(深入)”;
计算SQL LIMIT偏移量
偏移量必须是非负整数,且不能超过数据总量,否则MySQL返回空结果但不报错,容易掩盖逻辑缺陷。
第一步:确认每页条数$limit已定义且为正整数
第二步:用三元推导$offset$offset = ($page > 0) ? ($page - 1) * $limit : 0;
这一步必须依赖$page已通过上一阶段校验,否则$page为0或负数会导致$offset为负——MySQL不接受负偏移,会直接报错。【$page必须是经校验后的合法正整数】
第三步:若需进一步防越界(如总数不足时仍传入超大$page),可叠加总数判断:$offset = ($page 0) ? ($page - 1) * $limit : 0;
生成页码HTML链接的条件渲染
要为「上一页」「下一页」及数字页码生成带href的标签,但当前页不可点击,首页/末页需禁用对应按钮。
方法一:当前页数字不加链接<a href="https://www.php.cn/link/00cada81b307d5db4a1920b952e2137e'.$i.'">'.$i.'</a> → 改为:'.($i == $page ? '<span class="current">'.$i.'</span>' : '<a href="https://www.php.cn/link/00cada81b307d5db4a1920b952e2137e'.%24i.'">'.$i.'</a>').'
方法二:「上一页」链接仅在非首页时存在'.$page > 1 ? '<a href="https://www.php.cn/link/00cada81b307d5db4a1920b952e2137e'.(%24page-1).'">« 上一页</a>' : '<span class="disabled">« 上一页</span>'.'
方法三:「下一页」需同时判断是否已达末页'.$page 下一页 »' : '<span class="disabled">下一页 »</span>'.'
这里不能只用$page != $totalPages,因为$totalPages可能为0(无数据),此时$page=1也应禁用下一页。



















