news 2026/3/30 11:14:19

零基础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/3/24 7:01:09

实时AI监控测试实战:从理论到落地的全面指南

随着软件开发生命周期的加速&#xff0c;测试工程师面临需求频繁变更、回归测试工作量大、多环境兼容性挑战等问题。传统监控方法已难以满足敏捷开发需求&#xff0c;而AI驱动的实时监控成为破局关键。本文基于行业实践&#xff0c;系统解析5大AI监控工具&#xff0c;提供可复用…

作者头像 李华
网站建设 2026/3/22 21:17:30

‌“边界值测试用例”:不是0~100,是-1,0,1,99,100,101

边界值测试的基石作用‌ 在软件测试领域&#xff0c;边界值分析法&#xff08;Boundary Value Analysis, BVA&#xff09;是黑盒测试的核心技术之一&#xff0c;它专注于输入域的边缘值&#xff0c;以捕捉系统在临界点上的潜在缺陷。传统上&#xff0c;测试从业者常采用0~100的…

作者头像 李华
网站建设 2026/3/14 7:02:00

【图像加密】基于 DCT 变换的图像加密与解密附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/3/15 11:10:52

收藏!2026年AI行业最大机会,锁定应用层赛道

2026年AI行业的风口在哪里&#xff1f;答案毫无疑问——大模型应用层&#xff01;当底层模型竞争进入白热化&#xff0c;真正能落地变现、创造价值的应用层&#xff0c;正成为企业布局的核心&#xff0c;更藏着程序员的高薪跃迁密码。 字节跳动7大团队全速攻坚Agent智能体&…

作者头像 李华
网站建设 2026/3/24 17:39:12

有哪些搭建agent的框架是必须掌握的?

2026 年初&#xff08;当前时间点&#xff09;&#xff0c;AI Agent 开发框架已经高度成熟&#xff0c;“必须掌握” 的程度取决于你的定位&#xff1a; 想进大厂 / AI 工程方向 / 做生产级 Agent 系统 → 至少精通 2–3 个主流框架做 side project / 快速原型 / 研究方向 → …

作者头像 李华