PHP分页时应通过URL参数持久化每页条数,而非session;所有分页链接须显式携带per_page值,用http_build_query安全合并当前GET参数,并校验其合法性;前端切换时需用URLSearchParams更新per_page并重置page为1。

PHP分页时如何持久化每页显示条数
用户切换页码后,$_GET['per_page'] 丢失是常见问题。根本原因不是分页逻辑写错了,而是每次跳转都只带 page 参数,没把当前每页条数一并传下去。最直接的解法是:所有分页链接必须显式拼上 per_page 值,而不是依赖默认或 session 存储——后者容易在多标签页、刷新、分享链接等场景失效。
生成分页链接时必须携带 per_page 参数
不要用硬编码的 ?page=2,而要从当前请求中读取并透传 per_page。典型错误是只读 $_GET['page'] 却忽略其他筛选参数。
- 用
http_build_query()安全合并参数,比如:$params = $_GET; $params['page'] = $next_page; echo '?'.http_build_query($params);
- 若想限制可选值(如只允许 10/20/50),先校验再赋值:
$per_page = in_array($_GET['per_page'] ?? 20, [10,20,50]) ? (int)$_GET['per_page'] : 20; - 避免直接拼接 URL 字符串,防止 XSS 或参数覆盖(如
?page=2&per_page=50&per_page=10)
前端选择框 onchange 后需重定向并保留全部参数
用户点选“每页 50 条”时,不能只改 per_page,还要带上当前页码和其他过滤条件(如搜索关键词、分类 ID)。
- 用 JavaScript 获取当前 URL 参数,替换
per_page后跳转:const url = new URL(window.location); url.searchParams.set('per_page', select.value); url.searchParams.set('page', '1'); window.location = url.toString(); - 服务端也要做兜底:若
per_page缺失,按默认值(如 20)处理,但不自动跳转,否则会破坏浏览器后退逻辑 - 注意:不要用表单 submit + GET,容易丢失非标准字符(如中文搜索词),
URLSearchParams更可靠
为什么不用 session 记住 per_page
session 看似简单,但实际引入隐性状态,导致多个浏览器标签页互相干扰、分享链接失效、无痕模式下行为异常。
立即学习“PHP免费学习笔记(深入)”;
- 用户 A 在标签页 1 设为每页 50 条,标签页 2 切到第 3 页却显示每页 20 条(session 被覆盖)
- 用户把
?page=5链接发给同事,对方打开看到的是默认条数,而非原用户的设置 - CDN 或反向代理可能缓存了含 session 状态的响应,造成数据错乱
真正需要“记忆”的是 URL 本身——它天然承载状态,也符合 REST 原则。复杂点在于参数合并逻辑要写全,漏掉一个字段(比如 category_id),翻页后筛选就丢了。











