分页时应先用unset($_get['page'])剔除旧页码,再通过http_build_query()安全拼接新page及其他get参数;page参数须强制转整型、设默认值1、限制范围1≤page≤total_pages,避免sql注入与越界。

分页时如何保留原有GET参数
直接拼接 $_GET 会导致 URL 中重复出现 page 参数,或漏掉其他筛选条件(比如 category=php、search=test)。正确做法是先剔除分页参数,再合并新页码。
示例:当前 URL 是 /list.php?category=php&search=test&page=3,要生成第 4 页链接,不能硬写成 ?page=4,而应保留 category 和 search。
- 用
http_build_query()构造安全的查询字符串,避免手动拼接导致的编码错误 - 用
unset($_GET['page'])剔除旧分页键,再赋值新page - 注意:不要直接修改
$_GET全局数组用于后续逻辑,仅用于生成链接;业务逻辑中仍应单独取$_GET['page'] ?? 1
如何安全获取并校验 page 参数
$_GET['page'] 是用户可控输入,不校验会引发 SQL 注入、越界访问或空页错误。必须强制转为整数,并限制范围。
- 用
(int) $_GET['page']或filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT)转类型 - 设默认值:
$page = max(1, (int)($_GET['page'] ?? 1)),防止负数或 0 - 结合总页数做上限检查:
$page = min($page, $total_pages),避免生成无效链接 - 注意:MySQL 的
LIMIT偏移量从 0 开始,所以实际偏移应为($page - 1) * $per_page
生成带分页的 URL 链接(含多参数)
手写 URL 拼接容易出错,尤其当参数含中文、特殊符号或数组时。必须依赖 PHP 内置函数处理编码。
立即学习“PHP免费学习笔记(深入)”;
$params = $_GET; unset($params['page']); $params['page'] = $next_page; $next_url = '?' . http_build_query($params);
-
http_build_query()自动对键值进行urlencode(),无需手动处理 - 如果页面使用伪静态(如
/list/category/php/page/4),则需在路由层解析,但分页逻辑仍应统一用page参数参与计算 - 避免在
href中写死?page=,否则会丢失所有其他 GET 参数
分页 HTML 输出时常见陷阱
前端显示“上一页/下一页”和数字页码时,容易忽略边界情况,导致链接指向不存在的页或自身。
- 第一页不渲染“上一页”链接,最后一页不渲染“下一页”
- 页码区域建议控制在 5~7 个数字内(如当前是 6,则显示 4–8),避免过长;可用
range()+array_filter()生成有效页码数组 - 当前页链接应禁用或加
class="active",但 URL 仍需可点击(便于刷新或分享) - 注意:
<a href="?page=1">1</a>在已有其他参数时会清空它们 —— 必须用上面的http_build_query()动态生成
实际项目中,最容易被忽略的是对非数字 page 值的兜底处理(比如用户手动改 URL 输入 page=abc),它不会报错但可能导致 LIMIT -1 这类非法 SQL,务必在取值后立即校验并重置为 1。











