news 2026/2/10 13:39:17

零基础PHP从零到一实现上一页和下一页的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础PHP从零到一实现上一页和下一页的庖丁解牛

实现上一页和下一页,不是简单地用LIMIT offset, size,而是通过游标分页(Cursor-based Pagination)实现高性能、可扩展的分页。


一、核心原理:为什么不用 OFFSET?

▶ 1.OFFSET 的致命缺陷
-- 跳过 100 万行 → 扫描 1,000,010 行SELECT*FROMordersLIMIT1000000,10;
  • 问题
    • 性能随页码线性下降
    • 深度分页直接拖垮数据库
▶ 2.游标分页的优势
-- 仅扫描 10 行SELECT*FROMordersWHEREid>1000000ORDERBYidLIMIT10;
  • 优势
    • 性能恒定(O(1))
    • 适合无限滚动/深度分页

💡核心认知
“上一页/下一页” = 记录当前页首尾 ID,而非计算偏移量


二、完整实现:PHP + MySQL

▶ 1.数据库准备
-- 创建测试表CREATETABLEproducts(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255)NOTNULL,priceDECIMAL(10,2)NOTNULL);-- 插入测试数据INSERTINTOproducts(name,price)VALUES('Product 1',10.00),('Product 2',20.00),...('Product 100',1000.00);
▶ 2.PHP 分页逻辑
<?php// config.php$pdo=newPDO('mysql:host=localhost;dbname=test','user','pass');$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);// pagination.phpfunctiongetProducts($pdo,$direction='next',$cursor=null,$limit=10){if($direction==='next'){// 下一页:id > cursor$sql="SELECT * FROM products WHERE id > :cursor ORDER BY id ASC LIMIT :limit";$params=['cursor'=>$cursor??0,'limit'=>$limit];}else{// 上一页:id < cursor,按降序取,再反转$sql="SELECT * FROM products WHERE id < :cursor ORDER BY id DESC LIMIT :limit";$params=['cursor'=>$cursor,'limit'=>$limit];}$stmt=$pdo->prepare($sql);$stmt->bindValue(':cursor',$params['cursor'],PDO::PARAM_INT);$stmt->bindValue(':limit',$params['limit'],PDO::PARAM_INT);$stmt->execute();$rows=$stmt->fetchAll(PDO::FETCH_ASSOC);// 上一页结果需反转if($direction==='prev'){$rows=array_reverse($rows);}return$rows;}// 获取当前页数据$direction=$_GET['direction']??'next';$cursor=$_GET['cursor']??null;$products=getProducts($pdo,$direction,$cursor);// 提取首尾 ID$firstId=$products?$products[0]['id']:null;$lastId=$products?end($products)['id']:null;?>
▶ 3.前端 HTML
<!-- index.php --><!DOCTYPEhtml><html><head><title>产品列表</title></head><body><h1>产品列表</h1><ul><?php foreach ($products as $product): ?><li><?= htmlspecialchars($product['name']) ?>- $<?= $product['price'] ?></li><?php endforeach; ?></ul><!-- 分页按钮 --><div><?php if ($firstId): ?><ahref="?direction=prev&cursor=<?= $firstId ?>">上一页</a><?php endif; ?><?php if ($lastId): ?><ahref="?direction=next&cursor=<?= $lastId ?>">下一页</a><?php endif; ?></div></body></html>

三、关键机制解析

▶ 1.下一页逻辑
  • 参数cursor = 当前页最后一条的 id
  • 查询WHERE id > cursor ORDER BY id ASC
  • 结果:直接获取下一页 10 条
▶ 2.上一页逻辑
  • 参数cursor = 当前页第一条的 id
  • 查询WHERE id < cursor ORDER BY id DESC(倒序取)
  • 处理:PHP 中array_reverse()还原顺序
▶ 3.边界处理
  • 首页cursor = nullWHERE id > 0
  • 末页:无数据 → 隐藏“下一页”按钮

四、避坑指南

陷阱破局方案
忽略 XSS 风险输出时用htmlspecialchars()
未处理空结果检查$products是否为空
并发插入导致漏数据接受最终一致性(业务可容忍)
非自增主键确保排序字段是聚簇索引

五、终极心法

**“分页不是跳转,
而是锚点的传递——

  • 当你记录首尾 ID
    你在跳过扫描;
  • 当你反转上一页
    你在还原顺序;
  • 当你隐藏无效按钮
    你在优化体验。

真正的分页,
始于对索引的敬畏,
成于对细节的精控。”


结语

从今天起:

  1. 永远用游标分页替代 OFFSET
  2. 上一页用array_reverse()处理
  3. 输出数据必用htmlspecialchars()

因为最好的分页,
不是计算偏移,
而是精准传递每一程的锚点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 4:36:39

分享一套优质的SpringBoot+Vue学生作业管理系统

大家好&#xff0c;我是锋哥&#xff0c;看到一个不错的SpringBootVue学生作业管理系统&#xff0c;分享下哈。项目介绍这次开发的作业管理系统有管理员&#xff0c;教师&#xff0c;学生三个角色。教师和学生都可以进行注册然后再登录。学生可以修改自己的密码&#xff0c;查看…

作者头像 李华
网站建设 2026/2/7 23:14:18

为什么写java的都用jdk8?

写 Java 的程序员&#xff08;尤其是国内中大型企业、传统互联网、金融、政府、外包等场景&#xff09;到现在2026年1月还在大规模用 JDK 8 的原因&#xff0c;已经不是“技术最先进”&#xff0c;而是一堆现实约束叠加后的局部最优解。简单说&#xff1a;稳 > 新&#xff0…

作者头像 李华
网站建设 2026/2/10 3:17:35

想要学习Agent开发,听说有LangGraph框架,那还要学习LangChain吗?

是的&#xff0c;如果你主要目标是学习 Agent 开发&#xff0c;尤其是想做出可控、复杂、状态持久、生产级别的 Agent 系统&#xff0c;那么 LangGraph 是目前&#xff08;2026 年&#xff09;最值得优先深入的框架&#xff0c;但是否“必须”先学/同时学 LangChain 取决于你的…

作者头像 李华
网站建设 2026/2/8 9:19:22

大模型Agent的核心还是prompt?

不完全是&#xff0c;但 prompt&#xff08;以及更广义的“上下文工程”&#xff09;仍然是 LLM Agent 的核心基石之一&#xff0c;尤其在2026年初的实际工程实践中。 简单说&#xff1a;Agent 的“智能”本质上还是靠大模型的推理能力&#xff0c;而这个推理能力目前主要通过…

作者头像 李华
网站建设 2026/2/10 11:43:26

计算机毕业设计之springboot校园疫情管理微信小程序

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;校园疫情管理当然不能排除在外。校园疫情管理是在实际应用和软件工程的开发原理之上&#xff0c;运用微信开发者、java语言以及SpringBoot框架进…

作者头像 李华
网站建设 2026/2/9 11:16:37

DevOps平台2026:本土化与云原生双轨并行下的战略抉择

DevOps平台2026&#xff1a;本土化与云原生双轨并行下的战略抉择 数字化转型浪潮下&#xff0c;DevOps平台正经历着前所未有的变革与演进。2026年的技术版图呈现出明显的双轨并行特征&#xff1a;一方面是以Gitee为代表的本土化解决方案快速崛起&#xff0c;另一方面则是Jenki…

作者头像 李华