php 8.3 实现api分页查询的核心是安全获取page/limit参数、用pdo预处理语句执行limit/offset查询、单独count统计总数并返回含meta字段的标准json响应。

PHP 8.3 实现 API 接口的分页查询,核心是结合 HTTP 请求参数、数据库查询优化 和 标准响应结构。它不依赖新语法特性(PHP 8.3 本身未引入分页专属功能),但可利用其更严格的类型系统和性能改进提升代码健壮性与效率。
1. 定义分页参数并做安全校验
从请求中获取 page 和 limit(或 per_page),并强制类型转换与范围限制,避免 SQL 注入或内存溢出:
- page:默认为 1,必须 ≥ 1,整数类型
- limit:默认为 10,建议上限设为 100(防止大结果集拖垮服务)
- 用
filter_var()或强类型声明(如int $page = (int)($_GET['page'] ?? 1))确保数值化 - 超出范围时自动修正,例如:
$page = max(1, min($page, PHP_INT_MAX));
2. 构建带 LIMIT/OFFSET 的 SQL 查询(推荐使用 PDO)
用预处理语句防止注入,计算偏移量:OFFSET = ($page - 1) * $limit:
$offset = ($page - 1) * $limit;
$stmt = $pdo->prepare("SELECT id, title, created_at FROM posts WHERE status = ? ORDER BY created_at DESC LIMIT ? OFFSET ?");
$stmt->execute(['published', $limit, $offset]);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
注意:MySQL 8.0+ 支持 LIMIT ? OFFSET ?,PostgreSQL 同理;避免拼接字符串构造 SQL。
3. 查询总条数并生成分页元信息
单独执行 COUNT 查询(不要用 SQL_CALC_FOUND_ROWS,已废弃且低效):
- 复用 WHERE 条件(如
WHERE status = 'published')统计总数 - 计算总页数:
$totalPages = (int)ceil($totalCount / $limit); - 响应头中可加
X-Total-Count和Link(RFC 5988 风格),例如:Link: <?page =1&limit=10>; rel="first", <?page =3&limit=10>; rel="last"
4. 返回结构化 JSON 响应(符合 REST 最佳实践)
统一格式,包含数据主体 + 分页元数据,便于前端解析:
http_response_code(200);
header('Content-Type: application/json; charset=utf-8');
echo json_encode([
'data' => $data,
'meta' => [
'current_page' => $page,
'per_page' => $limit,
'total' => $totalCount,
'last_page' => $totalPages,
'from' => ($page - 1) * $limit + 1,
'to' => min($page * $limit, $totalCount)
]
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
PHP 8.3 的 json_encode() 默认支持更严格的 UTF-8 处理,无需额外转码。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











