PHP返回JSON分页数据需手动构造结构,包括data列表和meta分页元信息,严格校验参数、正确计算offset、查询总数而非仅count($data),并设置Content-Type头。

php返回json数据怎么分页_json分页数据返回实现【详解】

PHP 返回 JSON 分页数据时,必须手动构造分页结构

PHP 本身没有内置的「JSON 分页」函数,json_encode() 只负责序列化,分页逻辑(如当前页、总条数、每页数量、数据列表)得你自己组织。常见错误是只返回 $data 数组,前端拿不到 totalpage,导致无法渲染分页控件。

推荐结构:始终用统一顶层键包裹,比如 data 放列表、meta 放分页元信息。不要把分页字段和业务字段混在同级:

{
  "data": [...],
  "meta": {
    "total": 127,
    "per_page": 10,
    "current_page": 3,
    "last_page": 13,
    "from": 21,
    "to": 30
  }
}

MySQL LIMIT 偏移量计算容易出错

分页的核心是 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);

header('Content-Type: application/json') 不能少

不设 header,浏览器或前端框架(如 axios)可能把响应当文本处理,response.data 解析失败,控制台报 Unexpected token

Laravel 或 ThinkPHP 等框架已封装,但底层逻辑一样

框架的 paginate() 方法(如 Laravel 的 Post::paginate(10))返回的是 Paginator 对象,调用 ->toJson() 才是标准 JSON。它内部也做三件事:查总数、算 offset、查数据列表。

如果你在裸 PHP 里想模仿,关键就是别绕开「总数查询」—— 很多人图省事只查数据再 count($data),那 total 永远等于 per_page,前端永远显示「共 10 条」。

真正难的不是拼 JSON,是让分页参数、SQL 偏移、总数统计三者对齐。少一个环节,前端翻页就错乱。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。