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 的 LIMITOFFSET 配合手动计算。关键不是语言新特性,而是避免在高偏移量下性能崩塌。

常见错误是直接写 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_queryurlencode ——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实战)