PHP分页接口需用$_GET获取page和limit参数,page校验为正整数,limit限制最大值;偏移量为(page-1)*limit;须预处理防注入;返回data及pagination元信息;推荐PDO并启用异常模式。

PHP接口里怎么用 $_GET 接分页参数
分页必须从请求里拿到当前页码和每页条数,最常见的是用 page 和 limit。别硬写死,也别用 $_POST——接口调用方基本都走 GET 传参。
实操建议:
-
page默认设为1,但必须校验是否为正整数,intval($_GET['page'])不够,得加filter_var($_GET['page'], FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) -
limit要限制最大值(比如最多 100),防止恶意请求拖垮数据库,可设为min((int)$_GET['limit'] ?? 20, 100) - 别直接拼 SQL,哪怕只是简单分页,也要用预处理或至少转义,否则
OFFSET注入风险真实存在
MySQL 分页用 LIMIT 和 OFFSET 怎么算偏移量
偏移量不是 page * limit,而是 (page - 1) * limit。错这一步,第一页就跳过前 limit 条数据。
示例 SQL:
立即学习“PHP免费学习笔记(深入)”;
SELECT id, title FROM article ORDER BY id DESC LIMIT ? OFFSET ?
对应参数:
-
?(LIMIT)填$limit -
?(OFFSET)填($page - 1) * $limit
注意:大偏移量(比如 OFFSET 100000)性能差,后面查总数时会暴露这个问题。
怎么在接口里返回总条数和分页元信息
前端需要知道总页数、当前页、是否还有下一页,不能只扔数据。但别用 SELECT COUNT(*) 加主查询一起查——会多一次全表扫描。
实操建议:
- 先单独查总数:
SELECT COUNT(*) FROM article WHERE ...(条件要和主查询一致) - 用
ceil($total / $limit)算总页数,注意$total为 0 时别除零 - 返回结构建议包含:
data、pagination(含page、limit、total、pages、has_next) - 如果数据量极大且不要求精确总数,可以改用估算(如
SHOW TABLE STATUS的Rows字段),但得注明“约”
为什么用 PDO 而不是 mysqli 写分页接口
不是语法偏好问题,是错误处理和类型安全的差异。分页接口一旦出错,前端往往收不到明确提示,PDO 的 PDO::ERRMODE_EXCEPTION 能让异常冒出来,而不是静默失败。
关键配置:
- 初始化时加
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) - 用
bindValue()绑定limit和offset,注意PDO::PARAM_INT类型,避免字符串注入 -
limit和offset必须是整数,PDO 不会自动转换,传字符串会报错或行为异常
复杂点在于总数查询和主查询的条件必须严格同步,漏一个 WHERE 子句,前后数据对不上,但接口却看起来“正常”。这种错最难 debug。



















