php列表分页可通过laravel内置paginate、原生sql手动计算offset/limit、ajax无刷新加载、保留非page参数及安全校验五种方式实现,兼顾性能、体验与安全性。

如果您在使用PHP框架开发列表页面时需要实现分页功能,则可能是由于数据量过大导致单页加载缓慢或用户体验不佳。以下是实现列表分页查询与页面跳转的具体步骤:
一、使用框架内置分页器(以Laravel为例)
Laravel框架提供了Eloquent ORM和查询构造器原生支持的分页器,可自动处理SQL LIMIT/OFFSET计算、当前页识别及分页链接生成。
1、在控制器中调用模型的paginate方法,传入每页显示条数,例如:$users = User::paginate(10);
2、在Blade模板中使用{{$users->links()}}渲染分页导航栏;
立即学习“PHP免费学习笔记(深入)”;
3、框架会自动从GET参数?page中读取当前页码,并将分页信息注入到集合对象中;
4、在模板循环中直接遍历$users变量即可获取当前页数据,无需手动截取数组。
二、基于原生SQL与GET参数手动分页(通用方案)
该方法不依赖特定框架,适用于CodeIgniter、ThinkPHP或自定义轻量框架,通过计算OFFSET和LIMIT值完成数据库分页查询。
1、从$_GET['page']获取当前页码,若未设置则默认为1;
2、设定每页记录数(如15条),并计算OFFSET值:$offset = ($page - 1) * $per_page;
3、执行带LIMIT和OFFSET的SQL查询:SELECT * FROM articles ORDER BY id DESC LIMIT $per_page OFFSET $offset;
4、使用COUNT(*)查询总记录数,用于计算总页数:$total = $pdo->query("SELECT COUNT(*) FROM articles")->fetchColumn();
5、根据$total和$per_page推导出总页数,并生成包含?page=数字的HTML分页链接。
三、使用AJAX无刷新分页(提升交互体验)
避免整页重载,通过JavaScript捕获点击事件,异步请求新页数据并局部更新列表区域与分页栏。
1、为每个分页链接添加data-page属性,例如:2;
2、绑定click事件监听器,阻止默认跳转,获取data-page值并拼接URL参数;
3、发起AJAX GET请求至后端接口(如/api/articles?page=2&per_page=10),返回JSON格式的数据列表与分页元信息;
4、解析响应结果,清空原有列表容器,用innerHTML或DOM操作插入新数据项;
5、同步更新分页导航HTML,保持当前页高亮状态,并重新绑定新页链接的事件监听。
四、处理分页URL中的非page参数保留(SEO与功能兼容)
当列表页带有搜索条件、分类ID等其他GET参数时,分页链接需保留这些参数,否则翻页后筛选条件丢失。
1、使用http_build_query($_GET)获取完整查询字符串;
2、将$page参数单独提取并从原始数组中unset,再重新赋值为新页码;
3、重构查询数组:$queryParams = array_merge($_GET, ['page' => $newPage]);
4、生成链接时调用:$url = '?' . http_build_query($queryParams);
5、注意:必须对$queryParams中可能存在的危险字符做urlencode处理,防止XSS或URL截断。
五、分页安全性校验与边界防护
防止恶意用户篡改?page参数引发越界查询或性能攻击,需对页码值进行强制类型转换与范围限制。
1、使用intval()或filter_var($page, FILTER_VALIDATE_INT)确保$page为整数;
2、设定最小页码为1,最大页码不超过ceil($total / $per_page),超出则重定向至第一页或返回404;
3、对$per_page参数同样校验,限定合法范围(如5–100),禁止传入超大数值触发全表扫描;
4、严禁将未经校验的$_GET['page']直接拼接进SQL语句,否则构成SQL注入漏洞;
5、在PDO预处理中仅绑定$page和$per_page作为整型参数,不参与SQL结构拼接。











