PHP接口实现真分页需后端完整处理page参数:校验类型与范围、计算offset、SQL加LIMIT/OFFSET、同步查总数并返回pagination字段,否则仅为假分页。

PHP接口默认不带分页,加 page 参数不是简单塞进 URL 就行——得后端识别、校验、参与查询逻辑,否则只是“假装分页”。
page 参数必须由后端真正处理
前端在请求里加 ?page=2,如果 PHP 脚本没读取、没校验、没算 offset、没传给 SQL,那接口返回的还是全部数据或前几条固定结果。常见错误包括:
- 只写了
$_GET['page']却没做(int)强转和范围限制,导致 SQL 报错或越界 - 查了数据但没查总数,无法知道有没有下一页,前端不敢渲染页码导航
- SQL 缺少
ORDER BY,同一页刷新可能顺序不同,用户翻页时看到重复或漏掉记录
最少要补这四块逻辑
在原有接口代码里插入以下处理(以 PDO 为例):
-
取并校验 page:
$page = max(1, min((int)($_GET['page'] ?? 1), 999)); -
定每页数量:固定用
$per_page = 10;或从白名单选:in_array($limit ?? 10, [5,10,20,50]) ? (int)$limit : 10 -
算偏移量 & 查询数据:
$offset = ($page - 1) * $per_page;,然后用LIMIT :per_page OFFSET :offset预处理执行 -
查总数并返回分页信息:单独执行
SELECT COUNT(*) FROM ... WHERE ...(条件必须和主查询一致),响应中带上"pagination": {"total": 127, "page": 2, "per_page": 10, "pages": 13}
前端调用也要配合
不能只手动拼 ?page=3。建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
new URL()构造请求,自动保留其他参数(如搜索词、筛选项) - 响应必须是纯 JSON,开头清缓冲:
ob_end_clean();,设头:header('Content-Type: application/json; charset=utf-8'); - 错误时不输出 HTML 或警告,统一返回如
{"error": "page out of range"}
后续可升级的点
等跑通基础分页后,再考虑:
- 游标分页(
WHERE id < ? ORDER BY id DESC LIMIT 11)替代 OFFSET,避免大页码性能暴跌 - 总数缓存到 Redis(比如 5 分钟),减少高频 COUNT 压力
- 用
http_build_query($_GET)生成分页链接,安全保留所有筛选条件



















