news 2026/5/14 2:29:25

零基础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/5/13 22:23:09

终极预测:2030年,AI将自动编写测试用例?

——软件测试从业者的专业视角 引言&#xff1a;AI重塑测试领域的必然趋势 随着人工智能技术的飞速发展&#xff0c;软件测试行业正经历前所未有的变革。到2030年&#xff0c;AI不仅将辅助测试活动&#xff0c;更可能主导核心流程&#xff0c;其中测试用例的自动编写成为关键…

作者头像 李华
网站建设 2026/5/14 2:28:49

‌AI生成测试用例的“可执行性”难题:它写的你能跑吗?

AI生成的测试用例&#xff0c;平均可执行率不足60%‌ 根据信通院2026年初发布的《AI在软件测试中的规模化应用报告》&#xff0c;当前70%的中大型企业已部署AI生成测试用例工具&#xff0c;但‌实际可成功执行、无需人工修正的用例比例仅为54%-59%‌。这意味着每100条AI生成的…

作者头像 李华
网站建设 2026/5/1 2:06:19

【挑选合适的开源前端项目是商城系统开发的重要一步】

挑选合适的开源前端项目是商城系统开发的重要一步。下面我为你梳理了主流的技术方案和具体的开源项目&#xff0c;并提供选型建议&#xff0c;希望能帮你快速定位适合的方案。 &#x1f6e0;️ 主流技术栈与框架 当前商城前端开发主要围绕以下两种跨端框架展开&#xff0c;它们…

作者头像 李华
网站建设 2026/5/12 11:35:50

中屹指纹浏览器底层技术解析:内核级Hook改造与多维度特征校验实现

2026 年主流平台的风控体系已完成从表层参数检测到底层逻辑校验的技术升级&#xff0c;传统依靠 JS 注入实现指纹篡改的方案&#xff0c;因存在调用栈异常、渲染逻辑矛盾、参数关联性缺失等问题&#xff0c;被风控系统识别的概率大幅提升。中屹指纹浏览器基于 Chromium 125 内核…

作者头像 李华
网站建设 2026/5/13 5:52:18

大模型本地部署:Windows PC上从零开始部署ChatGML-6B-int4量化模型

ChatGLM-6B是清华大学知识工程和数据挖掘小组&#xff08;Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University&#xff09;发布的一个开源的对话机器人。6B表示这是ChatGLM模型的60亿参数的小规模版本&#xff0c;约60亿参数。 ChatGML-6B-int4量化…

作者头像 李华