PHP翻页函数不直接输出JSON,需手动组合data、total、per_page、current_page、last_page等字段为数组,再用json_encode()输出;须设Content-Type头、确保数字类型、避免BOM,否则前端解析失败。

PHP翻页函数怎么直接输出JSON结构
PHP翻页函数本身不返回JSON,它返回的是数据数组和分页元信息;要输出JSON,得手动组合结构再调用 json_encode()。常见错误是只对数据列表调用 json_encode(),漏掉总条数、当前页、页码范围等关键分页字段,导致前端无法渲染分页控件。
典型结构应包含:data(当前页数据)、total(总数)、per_page、current_page、last_page(总页数),可选 from/to(本页起止序号)。
- 别用
echo json_encode($items)单独输出数据,那是“假分页JSON” - 确保所有数字字段(如
total、current_page)是整型,避免字符串化引发前端计算错误 - 如果数据含中文或特殊字符,确认脚本文件保存为UTF-8无BOM,否则
json_encode()可能返回null
如何封装一个返回JSON的分页函数
与其每次手拼数组,不如写一个通用函数,接收查询结果、总数、当前页、每页条数,返回标准分页JSON响应。注意:这个函数不负责查数据库,只做格式组装和输出控制。
示例函数签名:function paginate_json(array $items, int $total, int $page, int $per_page): void
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 内部用
ceil($total / $per_page)算last_page,别依赖数据库返回的“最大页码” - 显式设置
header('Content-Type: application/json; charset=utf-8'),避免部分Nginx配置下被当text/html解析 - 加
http_response_code(200),方便前端统一处理状态;出错时应单独抛异常或返回错误JSON,不要混在分页结构里
function paginate_json(array $items, int $total, int $page, int $per_page): void {
$last_page = (int)ceil($total / $per_page);
$response = [
'data' => $items,
'total' => $total,
'per_page' => $per_page,
'current_page' => $page,
'last_page' => $last_page,
'from' => ($page - 1) * $per_page + 1,
'to' => min($page * $per_page, $total)
];
header('Content-Type: application/json; charset=utf-8');
http_response_code(200);
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
与Laravel Paginator::toArray()的区别在哪
如果你用的是Laravel,别直接拿 $paginator->toArray() 当最终JSON——它返回的结构嵌套深(比如 data 在 data 下一层),且含冗余键如 path、first_page_url,前端通常不需要。而原生PHP翻页函数返回的是扁平、可控的结构。
-
$paginator->toJson()会自动加HTTP头,但不可控;自定义函数可灵活加缓存头、CORS头 - Laravel的
last_page是整数,但to字段可能为null(空页时),需额外判断;手写函数可强制设为0或保持min()逻辑 - 性能上无差异,但手写函数少一层对象实例化开销,尤其在高频接口中可感知
前端接收到JSON后容易忽略的边界情况
后端JSON格式再标准,前端解析时仍常踩坑:比如 current_page 是字符串而非数字,导致 page + 1 === '2' 判断失败;或 last_page 为0时,前端没做防御性渲染,分页栏直接空白。
- JavaScript里务必用
parseInt(res.current_page, 10)转类型,别信Number()或一元+号(遇到空字符串会变0) - 检查
res.data.length === 0 && res.total > 0,说明当前页无数据但总数有值——可能是页码越界,需跳转到末页或提示“已到最后” - 若后端未返回
first_page_url类字段,前端生成页码链接时,注意URL编码:页码参数不能直接拼进路径,要用new URLSearchParams({page: 2}).toString()
最麻烦的其实是调试时浏览器看到的JSON响应里字段顺序乱、缩进不一致——那只是 json_encode() 默认行为,不影响解析,但容易让人误以为结构有问题。真要排查,优先看 console.log(typeof res.total) 和 Array.isArray(res.data),而不是盯着格式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










