分页链接必须保留所有筛选条件,确保用户不丢失状态;需验证$_get参数完整性,用http_build_query拼接并过滤敏感参数,laravel中可用withquerystring()或appends()实现。

在开发列表页时,分页链接必须保留当前所有筛选条件(如分类ID、搜索关键词、排序方式),否则点击下一页会丢失筛选状态,用户反复输入条件体验极差。
确认当前请求参数来源
先判断分页参数是否来自 $_GET。Laravel、ThinkPHP 等现代框架通常封装了 request()->all() 或 input() 方法,但底层仍依赖原始 $_GET;若你用的是原生 PHP 或自定义路由,【必须确保分页逻辑运行在完整 URL 查询字符串解析之后】,否则拼接出的链接会漏掉关键筛选项。
用 var_dump($_GET) 快速验证:打开带 ?category=2&keyword=php 的列表页,确认输出数组中包含这两个键。
基础拼接:手动构造 query string
方法一:用 http_build_query() 组装
第一步:取出全部原始参数 $params = $_GET;
第二步:覆盖 page 键值 $params['page'] = 3;
第三步:生成新查询串 $query = http_build_query($params);
第四步:拼入当前脚本路径 $url = $_SERVER['PHP_SELF'] . '?' . $query;
注意:http_build_query 自动处理 urlencode,无需额外转义;但若原始参数里有空数组或 null 值,它会跳过,导致参数丢失——遇到这种情况需提前 array_filter($params, function($v) { return $v !== null && $v !== ''; });。
安全过滤:排除不参与分页的敏感参数
有些参数不该透传到下一页,比如 token、signature、_t(时间戳)等防重放字段。直接 unset 即可:
unset($params['_t'], $params['token'], $params['signature']);
这一步不能省略,否则分页链接可能触发签名失效或接口限流。
框架适配:Laravel 中的 paginate() 链式保留
方法一:使用 withQueryString()
在控制器中调用分页时追加 →withQueryString(),例如:Article::where(...)->paginate(15)->withQueryString();
该方法自动提取当前请求全部查询参数并注入分页链接 href 属性,包括自定义筛选字段。
方法二:手动合并 request()->except('page')
在 Blade 模板中,遍历 $paginator->links() 前,先执行 $appends = request()->except('page'); 然后传给分页器:$articles->appends($appends);
【务必在调用 appends() 前完成 except(),否则 page 参数仍会残留】
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











