PHP分页常用五种方法:一、MySQL LIMIT/OFFSET手动分页;二、PDO预处理封装分页类;三、Pagerfanta第三方库集成;四、AJAX无刷新分页;五、游标分页优化大数据性能。

如果您在PHP中需要将大量数据分批次展示给用户,避免一次性加载全部内容导致页面卡顿或响应缓慢,则需要通过分页功能来控制每次显示的数据量。以下是实现PHP分页显示的几种常用方法:
一、基于MySQL LIMIT与OFFSET的手动分页
该方法直接利用SQL语句中的LIMIT和OFFSET子句,配合当前页码计算起始位置,适用于数据量适中、无频繁跳转至极远页码的场景。
1、获取当前页码,使用$_GET['page']传入,默认为1,并进行整型过滤与最小值校验。
2、设定每页显示记录数,例如$per_page = 10。
立即学习“PHP免费学习笔记(深入)”;
3、计算OFFSET值:$offset = ($page - 1) * $per_page。
4、编写带LIMIT和OFFSET的查询语句:SELECT * FROM table_name ORDER BY id DESC LIMIT $per_page OFFSET $offset。
5、执行查询并获取结果集,同时单独执行COUNT(*)查询以获得总记录数。
6、根据总记录数与每页数量计算总页数:$total_pages = ceil($total_count / $per_page)。
7、生成页码导航链接,对当前页做禁用或高亮处理,其余页码指向?page=数字形式的URL。
二、基于PDO预处理与分页类封装的结构化分页
该方法将分页逻辑抽象为可复用的类,结合PDO预处理防止SQL注入,提升代码安全性与维护性,适合中大型项目使用。
1、定义PageHelper类,构造函数接收数据库连接PDO对象、表名、字段列表、WHERE条件(可选)、排序字段(可选)。
2、在getPagedData()方法中,先执行COUNT查询获取总数,再拼接带LIMIT/OFFSET的主查询语句。
3、使用PDO::prepare()预处理主查询与COUNT查询,绑定参数防止注入。
4、调用getPageLinks()方法生成HTML页码导航,自动处理首页、末页、省略号及当前页偏移。
5、在页面中实例化该类,传入必要参数后调用getPagedData()获取数据数组,调用getPageLinks()输出分页HTML。
6、确保所有外部输入(如page、limit)均经过intval()强转与范围限制,避免越界或负数OFFSET错误。
三、使用第三方分页组件Pagerfanta实现快速集成
Pagerfanta是一个轻量级PHP分页库,支持多种适配器(Doctrine DBAL、Eloquent、Array等),无需手动写SQL即可完成分页渲染。
1、通过Composer安装:composer require knplabs/knp-pager-bundle(Symfony环境)或knplabs/pagerfanta(纯PHP项目)。
2、创建数据适配器,例如使用Pagerfanta\Adapter\DoctrineORMAdapter对接Doctrine QueryBuilder。
3、实例化Pagerfanta对象,传入适配器,并设置当前页码:$pagerfanta->setCurrentPage($page)。
4、调用$paginator->getCurrentPageResults()获取当前页数据集合。
5、使用内置视图模板(如TwitterBootstrap3View)渲染分页HTML,或自定义模板输出。
6、注意需确保查询结果集已启用select count(*) as total的兼容模式,否则部分适配器可能无法正确获取总条数。
四、基于AJAX的无刷新前端分页
该方式将分页请求交由JavaScript发起,后端仅返回JSON格式数据与分页元信息,减少整页重载,提升用户体验。
1、前端使用fetch或jQuery.ajax向PHP接口发送GET请求,携带page与per_page参数。
2、PHP接口接收参数,执行与方法一相同的LIMIT/OFFSET查询,同时查出total_count。
3、构造标准JSON响应:{ "data": [...], "current_page": 2, "last_page": 15, "per_page": 10, "total": 147 }。
4、前端解析JSON,清空原列表容器,循环插入新数据行,并调用函数动态重绘分页栏。
5、为防止重复请求,应在点击页码时禁用按钮并添加加载状态提示,响应完成后恢复交互。
五、基于游标分页(Cursor-based Pagination)替代传统OFFSET
针对大数据量(百万级以上)且排序字段存在索引的场景,游标分页可规避OFFSET性能衰减问题,通过上一页最后一条记录的排序值作为下一页起点。
1、要求排序字段(如created_at、id)具备唯一性与索引支持,禁止使用非索引字段排序。
2、首次请求不带cursor参数,按ORDER BY created_at DESC LIMIT 20获取首屏数据。
3、从结果集中取出最后一条记录的created_at值,编码为base64字符串作为cursor参数。
4、下一页请求携带cursor参数,SQL改为WHERE created_at
5、PHP中需对cursor参数进行严格解码与类型校验,拒绝非法字符或时间格式错误,防止SQL注入或逻辑异常。











