您的位置:首页 >PHP返回JSON分页数据怎么实现
发布于2026-04-09 阅读(0)
扫一扫,手机访问
PHP返回JSON分页数据需手动构造结构,包括data列表和meta分页元信息,严格校验参数、正确计算offset、查询总数而非仅count($data),并设置Content-Type头。

PHP 本身没有内置的「JSON 分页」函数,json_encode() 只负责序列化,分页逻辑(如当前页、总条数、每页数量、数据列表)得你自己组织。常见错误是只返回 $data 数组,前端拿不到 total 或 page,导致无法渲染分页控件。
推荐结构:始终用统一顶层键包裹,比如 data 放列表、meta 放分页元信息。不要把分页字段和业务字段混在同级:
{
"data": [...],
"meta": {
"total": 127,
"per_page": 10,
"current_page": 3,
"last_page": 13,
"from": 21,
"to": 30
}
}$total = $pdo->query("SELECT COUNT(*) FROM ...")->fetchColumn(),不能靠 count($data) —— 那只是当前页数量last_page 要用 ceil($total / $per_page) 算,别四舍五入page 和 per_page 必须校验:max(1, (int)$_GET['page']),防 SQL 注入或越界分页的核心是 SQL 的 LIMIT offset, length,但 offset = (page - 1) * per_page 这个公式,很多人漏了减 1,结果第一页就跳过前 per_page 条。
示例(PDO):
$page = max(1, (int)($_GET['page'] ?? 1)); $per_page = max(1, min(100, (int)($_GET['per_page'] ?? 10))); // 限制最大每页100条 $offset = ($page - 1) * $per_page;$stmt = $pdo->prepare("SELECT id, title FROM posts WHERE status = ? ORDER BY id DESC LIMIT ?, ?"); $stmt->execute([1, $offset, $per_page]); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
LIMIT $page, $per_page —— 这是第 $page 页起始位置,不是「第几页」LIMIT + OFFSET 会全表扫描不设 header,浏览器或前端框架(如 axios)可能把响应当文本处理,response.data 解析失败,控制台报 Unexpected token。
echo json_encode(...) 前调用:header('Content-Type: application/json; charset=utf-8');JSON parse error: Unexpected tokenvar_dump(json_last_error_msg()); 检查编码失败原因,常见于中文未 UTF-8 编码或资源含 null 字节框架的 paginate() 方法(如 Laravel 的 Post::paginate(10))返回的是 Paginator 对象,调用 ->toJson() 才是标准 JSON。它内部也做三件事:查总数、算 offset、查数据列表。
如果你在裸 PHP 里想模仿,关键就是别绕开「总数查询」—— 很多人图省事只查数据再 count($data),那 total 永远等于 per_page,前端永远显示「共 10 条」。
真正难的不是拼 JSON,是让分页参数、SQL 偏移、总数统计三者对齐。少一个环节,前端翻页就错乱。
上一篇:螃蟹交易平台实名认证教程详解
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9