PHP分页通过分块加载数据提升性能与体验,核心步骤包括:计算总页数并校验页码合法性;用LIMIT偏移量查询当前页数据;生成带首页、尾页、上下页及页码的导航链接;最后封装为可复用的Pagination类。

当网页需要展示大量数据时,一次性加载全部内容会导致页面响应缓慢、用户体验下降。PHP分页功能通过将数据划分为多个页面,每次仅查询并显示当前页所需记录,从而提升性能与可读性。以下是实现数据分页显示的核心逻辑与具体步骤:
一、计算总页数与当前页码
分页的前提是获知数据总量及每页显示条数,据此推算总页数,并校验用户请求的页码是否合法。该步骤确保后续查询范围可控、不越界。
1、使用 SQL 的 COUNT(*) 查询数据总条数,例如:SELECT COUNT(*) FROM articles。
2、从 URL 参数(如 ?page=3)中获取当前页码,若未提供则默认为 1,例如:$page = isset($_GET['page']) ? (int)$_GET['page'] : 1。
立即学习“PHP免费学习笔记(深入)”;
3、设定每页显示记录数(如 10 条),并计算总页数:$total_pages = ceil($total_records / $per_page)。
4、限制当前页码不小于 1 且不大于总页数:$page = max(1, min($page, $total_pages))。
二、构造 LIMIT 偏移量进行分页查询
MySQL 中的 LIMIT 子句支持偏移量 + 行数形式,PHP 需根据当前页码动态计算起始位置,确保每次只取出对应页面的数据块。
1、计算 SQL 查询的起始偏移量:$offset = ($page - 1) * $per_page。
2、编写带 LIMIT 的 SELECT 语句,例如:SELECT * FROM articles ORDER BY id DESC LIMIT $offset, $per_page。
3、使用 PDO 或 mysqli 执行该查询,获取当前页数据结果集。
三、生成前端分页导航链接
用户需能点击页码跳转,因此须依据当前页码、总页数等信息动态生成 HTML 分页链接,包含首页、上一页、页码列表、下一页、尾页等基础元素。
1、输出首页链接:首页,但仅当 $page > 1 时显示。
2、输出上一页链接:上一页,仅当 $page > 1 时显示。
3、循环输出页码数字链接,对当前页添加禁用样式或 class 标识,例如:。
4、输出下一页与尾页链接,条件分别为 $page
四、使用 PDO 预处理防止 SQL 注入
直接拼接页码和每页条数到 SQL 中存在风险,尤其当 $per_page 来自用户输入时。应将每页条数作为整型强制转换,页码也做类型校验,再交由预处理机制执行。
1、定义每页条数并强转为整型:$per_page = (int)$_GET['limit'] ?? 10,且限定范围(如 5–50)。
2、构造参数化查询语句,其中 LIMIT 参数不可直接绑定,需在拼接前完成类型安全校验:$sql = "SELECT * FROM products ORDER BY created_at DESC LIMIT ?, ?";。
3、执行时传入已校验的整数值:$stmt->execute([$offset, $per_page]);。
五、封装为可复用的分页类
将上述逻辑抽象为独立类,便于在多个数据表查询中重复调用,减少冗余代码,提高维护性与一致性。
1、定义 Pagination 类,构造函数接收总记录数、当前页码、每页条数三个必要参数。
2、在类中自动计算 $total_pages、$offset、$start_page、$end_page 等属性,供外部调用。
3、提供 getLimitSql() 方法返回格式化后的 LIMIT 字符串,例如:return "$offset, $per_page";。
4、提供 render() 方法输出完整 HTML 导航栏字符串,支持自定义 URL 参数与 CSS class。










