零基础PHP从零到一实现上一页和下一页的庖丁解牛
实现上一页和下一页不是简单地用LIMIT offset, size而是通过游标分页Cursor-based Pagination实现高性能、可扩展的分页。一、核心原理为什么不用 OFFSET▶ 1.OFFSET 的致命缺陷-- 跳过 100 万行 → 扫描 1,000,010 行SELECT*FROMordersLIMIT1000000,10;问题性能随页码线性下降深度分页直接拖垮数据库▶ 2.游标分页的优势-- 仅扫描 10 行SELECT*FROMordersWHEREid1000000ORDERBYidLIMIT10;优势性能恒定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$pdonewPDO(mysql:hostlocalhost;dbnametest,user,pass);$pdo-setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);// pagination.phpfunctiongetProducts($pdo,$directionnext,$cursornull,$limit10){if($directionnext){// 下一页id cursor$sqlSELECT * FROM products WHERE id :cursor ORDER BY id ASC LIMIT :limit;$params[cursor$cursor??0,limit$limit];}else{// 上一页id cursor按降序取再反转$sqlSELECT * 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($directionprev){$rowsarray_reverse($rows);}return$rows;}// 获取当前页数据$direction$_GET[direction]??next;$cursor$_GET[cursor]??null;$productsgetProducts($pdo,$direction,$cursor);// 提取首尾 ID$firstId$products?$products[0][id]:null;$lastId$products?end($products)[id]:null;?▶ 3.前端 HTML!-- index.php --!DOCTYPEhtmlhtmlheadtitle产品列表/title/headbodyh1产品列表/h1ul?php foreach ($products as $product): ?li? htmlspecialchars($product[name]) ?- $? $product[price] ?/li?php endforeach; ?/ul!-- 分页按钮 --div?php if ($firstId): ?ahref?directionprevcursor? $firstId ?上一页/a?php endif; ??php if ($lastId): ?ahref?directionnextcursor? $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 null→WHERE id 0末页无数据 → 隐藏“下一页”按钮四、避坑指南陷阱破局方案忽略 XSS 风险输出时用htmlspecialchars()未处理空结果检查$products是否为空并发插入导致漏数据接受最终一致性业务可容忍非自增主键确保排序字段是聚簇索引五、终极心法**“分页不是跳转而是锚点的传递——当你记录首尾 ID你在跳过扫描当你反转上一页你在还原顺序当你隐藏无效按钮你在优化体验。真正的分页始于对索引的敬畏成于对细节的精控。”结语从今天起永远用游标分页替代 OFFSET上一页用array_reverse()处理输出数据必用htmlspecialchars()因为最好的分页不是计算偏移而是精准传递每一程的锚点。

相关新闻

9999999

9999999

99999999

2026/7/3 15:46:16 阅读更多 →
2026年趋势:开发者必学的联邦学习测试

2026年趋势:开发者必学的联邦学习测试

联邦学习测试的紧迫性与专业价值 随着数据隐私法规趋严(如2026年欧盟AI法案),联邦学习(Federated Learning, FL)已成为分布式AI的核心范式,允许多方协作训练模型而无需共享原始数据。然而,其去…

2026/7/4 8:35:40 阅读更多 →
震惊!这3个VS Code插件让调试快如闪电:软件测试从业者的效率革命

震惊!这3个VS Code插件让调试快如闪电:软件测试从业者的效率革命

在软件测试领域,调试是耗时且关键的环节,占测试周期的30%以上。测试工程师常面临代码错误定位难、环境依赖复杂和测试执行慢等问题,导致项目延期。 VS Code作为轻量级IDE,通过插件生态能显著优化调试流程。本文精选三个高效插件—…

2026/7/3 15:46:18 阅读更多 →

最新新闻

AI模型Web服务安全加固实战:从CSRF/XSS防护到生产部署

AI模型Web服务安全加固实战:从CSRF/XSS防护到生产部署

1. 项目概述:当AI视觉模型遇上Web安全最近在部署一个基于OFA(One-For-All)的图像语义蕴含模型服务时,我遇到了一个非常典型但又容易被忽视的问题:我们往往把绝大部分精力都花在了模型调优、接口性能优化上,…

2026/7/5 23:29:06 阅读更多 →
视频嵌入表示技术:从3D CNN到Transformer的实践指南

视频嵌入表示技术:从3D CNN到Transformer的实践指南

1. 视频嵌入表示生成方案概述视频嵌入表示(Video Embedding)是计算机视觉领域将原始视频数据转化为低维稠密向量的关键技术。不同于传统视频处理直接操作像素数据,嵌入表示通过深度学习模型提取视频的语义特征,形成固定长度的向量…

2026/7/5 23:29:06 阅读更多 →
GPT-4o与Claude 3.5 Sonnet模型选型实战指南

GPT-4o与Claude 3.5 Sonnet模型选型实战指南

该项目标题存在严重事实性错误与误导风险,不符合内容安全与专业规范要求。根据公开、权威、可验证的官方信息渠道(OpenAI官网、主流科技媒体如The Verge、TechCrunch、MIT Technology Review等2024年至今的持续追踪报道),截至目前…

2026/7/5 23:29:06 阅读更多 →
DC-DC降压转换器设计与PID控制优化实践

DC-DC降压转换器设计与PID控制优化实践

1. 项目背景与核心器件选型解析在电力电子领域,DC-DC降压转换器(Buck Converter)是最基础也最关键的拓扑结构之一。这次我们要实现的方案采用了171010550电源管理IC与PIC18F97J60微控制器的组合,这个搭配在工业控制领域颇具代表性…

2026/7/5 23:25:05 阅读更多 →
AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 面对繁重的在线学习任务,你是否还在为U校园平台的网课作业而烦恼…

2026/7/5 23:23:04 阅读更多 →
XXE漏洞深度解析:从XML外部实体注入原理到实战防御

XXE漏洞深度解析:从XML外部实体注入原理到实战防御

1. 项目概述:为什么XXE漏洞至今仍是“隐形杀手”?在Web安全领域,SQL注入、XSS这些名词大家耳熟能详,但提到XXE(XML External Entity Injection,XML外部实体注入),很多开发者甚至安全…

2026/7/5 23:19:03 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻