PHP分页核心是用LIMIT和OFFSET控制查询,需校验页码合法性、防SQL注入、先查总数再查数据,并生成带参数的智能页码HTML。

用PHP实现分页查询,核心是控制SQL的 LIMIT 和 OFFSET,再配合当前页码、每页条数、总记录数动态生成页码链接。关键不在写多少代码,而在于理清逻辑、防止越界、避免SQL注入。
计算分页参数并校验输入
用户传来的页码(如 page=3)必须过滤和约束:不能为负、不能为0、不能超过最大页数。
- 用
filter_input()或(int)强转获取页码,并设默认值为 1 - 每页条数建议固定(如 10),也可由用户指定但需限制范围(如 5–50)
- 用
max(1, min($page, $total_pages))确保页码合法
查总数 + 查当前页数据(两步不可少)
先执行一条 SELECT COUNT(*) 获取总记录数,再用 LIMIT+OFFSET 查真实数据。不要试图“只查一次”省掉 count —— 无法知道是否有下一页、总页数、当前是否越界。
- 使用预处理语句(
PDO::prepare()或mysqli->prepare())防止注入 - OFFSET = (
$page - 1) *$per_page,例如第3页、每页10条 → OFFSET 20 - 示例SQL:
SELECT id,name FROM users ORDER BY id DESC LIMIT ? OFFSET ?
生成可点击的页码HTML
不是简单输出 1 2 3 …,而是兼顾体验:显示前后各2个页码、省略号、首尾页、当前页高亮。
立即学习“PHP免费学习笔记(深入)”;
- 若总页数 ≤ 7,全部列出;否则显示:1 … 左侧2页 当前页 右侧2页 … 总页数
- 每个页码链接保留原有查询参数(如搜索关键词
q=php),用http_build_query()拼接 - 禁用“上一页/下一页”按钮时,用
disabled或不加链接,而非隐藏
前端展示与用户体验细节
分页不只是数字链接。告诉用户“当前显示第 21–30 条,共 137 条”,比光看页码更直观。
- 起始序号 = (
$page - 1) *$per_page+ 1;结束序号 =min($page * $per_page, $total) - 当无数据时(如搜索结果为空),显示“暂无数据”,不渲染分页栏
- 移动端建议用“加载更多”或无限滚动替代传统页码,后端仍按 offset 分页提供接口
不复杂但容易忽略:每次分页请求都应重新计算总数(除非数据极静态),且缓存要谨慎——带搜索条件的分页不适合全页缓存。



















