php8.4如何实现分页功能_php8.4分页逻辑与代码实现教程【操作】
发布时间 - 2025-12-27 00:00:00 点击率:次PHP 8.4 分页需用 PDO 预处理+LIMIT/OFFSET,严防 SQL 注入与高偏移性能问题;推荐游标分页替代 OFFSET,URL 参数须用 http_build_query 自动编码。
PHP 8.4 中用 PDO + OFFSET 实现基础分页
PHP 8.4 本身不内置分页类,分页仍是靠 SQL 的 LIMIT 和 OFFSET 配合手动计算。关键不是语言新特性,而是避免在高偏移量下性能崩塌。
常见错误是直接写 LIMIT 20 OFFSET 10000——MySQL 仍要扫描前 10000 行,响应变慢甚至超时。
-
$page必须过滤为正整数:filter_var($page, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]) -
$limit建议固定(如 20),不要让用户传入;防止恶意传limit=999999 - 总条数查询必须独立执行,不能依赖
PDOStatement::rowCount()(对SELECT不可靠)
如何安全计算总页数并避免 SQL injection
拼接 count(*) 查询时,条件必须与主查询完全一致,且所有变量必须用预处理参数绑定。
错误写法:"WHERE status = '" . $_GET['status'] . "'" —— 直接中招 SQL 注入。
$sqlCount = "SELECT COUNT(*) FROM articles WHERE status = ?"; $stmtCount = $pdo->prepare($sqlCount); $stmtCount->execute([$_GET['status'] ?? 'published']); $total = (int) $stmtCount->fetchColumn();$limit = 20; $page = max(1,
(int)($_GET['page'] ?? 1)); $offset = ($page - 1) * $limit;
$sqlList = "SELECT id, title, created_at FROM articles WHERE status = ? ORDER BY id DESC LIMIT ? OFFSET ?"; $stmtList = $pdo->prepare($sqlList); $stmtList->execute([$_GET['status'] ?? 'published', $limit, $offset]); $items = $stmtList->fetchAll(PDO::FETCH_ASSOC);
$totalPages = (int) ceil($total / $limit);
PHP 8.4 下推荐用游标分页替代 OFFSET(尤其数据频繁增删)
当列表按时间/ID 有序且允许“只能往后翻”时,游标分页更稳定。它不依赖行号,而是用上一页最后一条的 id 作为下一页起点。
优势:无 OFFSET 性能衰减、结果不会因中间插入/删除而跳漏或重复。
- 请求示例:
?cursor=12345&limit=20(取id 的最新 20 条) - SQL 必须带
ORDER BY id DESC,且id有索引 - 首次访问无
cursor,则不加WHERE条件,但需记录首条id供后续翻页
分页链接生成时注意 urlencode 查询参数
如果分页 URL 包含中文分类名、标签等,$_GET 参数未编码会导致链接断裂或 400 错误。
例如:category=后端开发 必须变成 category=%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91。
// 正确生成下一页链接 $params = $_GET; $params['page'] = $page + 1; $query = http_build_query($params); $nextUrl = '?' . $query; // 自动处理 urlencode
别手拼 "?page=".($page+1)."&category=".$cat,这是 XSS 和乱码温床。
游标值、分类名、状态码这些动态参数,只要进 URL 就得过 http_build_query 或 urlencode ——PHP 8.4 不会替你做这件事。
# mysql
# php
# go
# php8
# 编码
# 后端
# 状态码
# 后端开发
# sql
# xss
# count
# select
# filter_var
# pdo
# 分页
# 下一页
# 行号
# 这是
# 首次
# 这件事
# 仍是
# 中招
# 就得
# 不加
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何续费美橙建站之星域名及服务?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何在云服务器上快速搭建个人网站?
如何在景安服务器上快速搭建个人网站?
微信h5制作网站有哪些,免费微信H5页面制作工具?
利用JavaScript实现拖拽改变元素大小
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
如何快速配置高效服务器建站软件?
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel如何配置任务调度?(Cron Job示例)
在Oracle关闭情况下如何修改spfile的参数
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
新三国志曹操传主线渭水交兵攻略
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
Android自定义控件实现温度旋转按钮效果
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
javascript中闭包概念与用法深入理解
如何快速搭建支持数据库操作的智能建站平台?
如何在宝塔面板中创建新站点?
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Python高阶函数应用_函数作为参数说明【指导】
Laravel如何发送系统通知?(Notification渠道示例)
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
制作电商网页,电商供应链怎么做?
Laravel如何配置Horizon来管理队列?(安装和使用)
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
文字头像制作网站推荐软件,醒图能自动配文字吗?
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
JavaScript如何实现类型判断_typeof和instanceof有什么区别
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
微信小程序 闭包写法详细介绍
如何基于云服务器快速搭建网站及云盘系统?
Laravel如何实现事件和监听器?(Event & Listener实战)


(int)($_GET['page'] ?? 1));
$offset = ($page - 1) * $limit;