分页时url参数丢失的根本原因是未保留$_get中除page外的其他参数。正确做法是用http_build_query()动态生成查询字符串,过滤敏感参数,并妥善处理伪静态路由和ajax请求中的参数传递。

分页时 URL 参数丢失,本质是 $_GET 中原有参数没被带入下一页链接 —— 不是 PHP 本身的问题,而是你拼接分页链接时漏掉了非 page 的其他参数。
分页链接里只写 page=2 却丢了 search=abc 和 sort=name
这是最常见的情况:用固定字符串拼接分页 URL,比如 "?page=2",直接覆盖了原始查询参数。
- 正确做法是保留当前所有
$_GET键值,仅更新page值 - 用
http_build_query()重新生成查询字符串,而不是手动拼接 - 注意过滤掉不需要透传的参数(如
token、debug),避免污染分页链接
示例:
$params = $_GET; $params['page'] = $next_page; $url = '?' . http_build_query($params);
用了 $_SERVER['REQUEST_URI'] 但没处理已有查询参数
直接在 REQUEST_URI 后追加 &page=2,会导致重复问号或参数错乱,比如 /list.php?search=x&page=1&page=2。
立即学习“PHP免费学习笔记(深入)”;
- 先用
parse_url()拆解原始 URI,取出query部分 - 再用
parse_str()转成数组,修改page后重建查询串 - 不要对
REQUEST_URI做字符串截断或正则替换,容易出边界问题
前端用 JS 切换页码却没同步传递全部参数
AJAX 分页时,如果只传了 {page: 2},后端接收不到 search 或 category_id,查询结果就错了。
- JS 发起请求前,应从当前 URL 或隐藏表单字段中提取完整参数对象
- 推荐把原始参数存为 JSON 到
data-params属性,避免每次解析 URL - 后端不要依赖
$_GET做分页逻辑判断,统一用显式传入的参数数组
伪静态路由导致 $_GET 为空或不全
用 Nginx/Apache 重写把 /list/page/2 映射到 list.php,但没把路径参数注入 $_GET,结果 $_GET 是空的。
- 检查重写规则是否带了
query_string透传(Nginx 要加?$args) - 更稳妥的方式:在入口脚本里手动解析
$_SERVER['REQUEST_URI'],提取路径段并合并进$_GET - 避免在分页函数里直接读
$_GET,改用封装好的get_pagination_params()统一获取
真正麻烦的不是怎么拼链接,而是哪些参数该留、哪些该剔除 —— 比如搜索关键词要留,CSRF token 和调试开关必须去掉。这个取舍逻辑一旦写死在模板里,后期加筛选条件就很容易漏传。










