PHP分页效率终结版(推荐)

PHP分页效率终结版(推荐)攻略

什么是分页?

分页,即将较大的数据集合分为若干个页面显示,一般常见于数据量较大的网站,如新闻网站、电商网站等。

PHP分页的基本原理

在PHP中,分页的基本原理就是根据传入的当前页数和每页显示的数据数量进行计算,从数据库中查询相应数量的数据,最后在前端渲染出分页导航条和当前页的数据。

在计算分页的过程中,一般会用到以下几个关键变量:

  • 当前页数
  • 每页显示的数据数量
  • 数据总条数
  • 总页数

常用的分页方法和问题

常见的分页方法有两种:基于LIMIT语句的分页和基于游标的分页。

基于LIMIT语句的分页简单易用,但当数据量比较大时,会出现效率问题,因为每次查询数据时都需要计算OFFSET,只要总条数非常大,此时分页的效果将非常拖沓。

基于游标的分页,利用数据库自身的机制进行分页,速度更快,并且可以轻松进行查询优化,但是实现起来较为复杂。

此外,分页还有一些常见的问题,例如数据总条数变化、页面重复等问题,需要在编写分页代码时予以解决。

效率终结版分页实现方法

这个效率终结版的分页实现方法是基于游标的分页,具体步骤如下:

  1. 获取排序字段及排序方式,获取当前页数和每页显示的数据数量。

  2. 执行一条SQL语句获取第一页的数据(假设共有N条数据),查询语句中必须包含排序字段和排序方式。

SELECT * FROM table ORDER BY field ASC/DESC LIMIT 0, perpage;
  1. 从第一页的数据中获取排序字段最后一项的值,假设这个值为lastVal。

  2. 执行一条SQL语句获取大于lastVal的perpage条数据。

SELECT * FROM table WHERE field > lastVal ORDER BY field ASC/DESC LIMIT 0, perpage;
  1. 如果查询到数据,将这些数据进行渲染展示,同时更新lastVal的值。

  2. 重复执行第4步和第5步,直到查询到的数据为空或者达到了要展示的数量。

  3. 根据总条数和每页显示的数量计算出总页数。

  4. 根据当前页码和总页数渲染分页导航条。

这种分页方法相比基于LIMIT语句的分页速度更快,效率更高,而且不会出现数据重复的问题。

示例1:基本用法

以下是一个简单的示例代码:

// 获取当前页数和每页显示的数据数量
$pageNum = isset($_GET['pageNum']) ? $_GET['pageNum'] : 1;
$pageSize = 10;

// 获取排序字段及排序方式
$sortField = 'id';
$sortOrder = 'ASC';

// 计算limit偏移量
$offset = ($pageNum - 1) * $pageSize;

// 查询数据总条数
$sql1 = "SELECT COUNT(*) as count FROM table";
$result1 = $conn->query($sql1);
$row = $result1->fetch_assoc();
$total = $row['count'];

// 计算总页数
$totalPage = ceil($total / $pageSize);

// 查询数据
$sql2 = "SELECT * FROM table ORDER BY $sortField $sortOrder LIMIT $offset, $pageSize";
$result2 = $conn->query($sql2);

// 渲染数据
while ($row = $result2->fetch_assoc()) {
    // 渲染数据行
}

// 渲染分页导航条
for ($i = 1; $i <= $totalPage; $i++) {
    // 渲染页码链接
}

示例2:分页导航条带省略和数字链接

以下是一个带有省略和数字链接样式的分页导航条示例代码:

// 获取当前页数和每页显示的数据数量
$pageNum = isset($_GET['pageNum']) ? $_GET['pageNum'] : 1;
$pageSize = 10;

// 获取排序字段及排序方式
$sortField = 'id';
$sortOrder = 'ASC';

// 计算limit偏移量
$offset = ($pageNum - 1) * $pageSize;

// 查询数据总条数
$sql1 = "SELECT COUNT(*) as count FROM table";
$result1 = $conn->query($sql1);
$row = $result1->fetch_assoc();
$total = $row['count'];

// 计算总页数
$totalPage = ceil($total / $pageSize);

// 渲染分页导航条
echo '<ul class="pagination">';
// 第一页
if ($pageNum == 1) {
    echo '<li class="disabled"><a href="#">&laquo;</a></li>';
} else {
    echo '<li><a href="?pageNum=1">&laquo;</a></li>';
}
// 省略号
if ($pageNum > 4) {
    echo '<li><a href="?pageNum='.($pageNum - 3).'">'.($pageNum - 3).'</a></li>';
    echo '<li><a href="?pageNum='.($pageNum - 2).'">'.($pageNum - 2).'</a></li>';
    echo '<li><a href="?pageNum='.($pageNum - 1).'">'.($pageNum - 1).'</a></li>';
}
// 当前页数左侧的四个链接
if ($pageNum > 1) {
    echo '<li><a href="?pageNum='.($pageNum - 1).'">'.($pageNum - 1).'</a></li>';
}
if ($pageNum > 2) {
    echo '<li><a href="?pageNum='.($pageNum - 2).'">'.($pageNum - 2).'</a></li>';
}
if ($pageNum > 3) {
    echo '<li><a href="?pageNum='.($pageNum - 3).'">'.($pageNum - 3).'</a></li>';
}
if ($pageNum > 4) {
    echo '<li class="disabled"><a href="#">...</a></li>';
}
// 当前页
echo '<li class="active"><a href="#">'.$pageNum.'</a></li>';
// 当前页右侧的四个链接
if ($pageNum < $totalPage) {
    echo '<li><a href="?pageNum='.($pageNum + 1).'">'.($pageNum + 1).'</a></li>';
}
if ($pageNum < ($totalPage - 1)) {
    echo '<li><a href="?pageNum='.($pageNum + 2).'">'.($pageNum + 2).'</a></li>';
}
if ($pageNum < ($totalPage - 2)) {
    echo '<li><a href="?pageNum='.($pageNum + 3).'">'.($pageNum + 3).'</a></li>';
}
if ($pageNum < ($totalPage - 3)) {
    echo '<li class="disabled"><a href="#">...</a></li>';
}
// 最后一页
if ($pageNum == $totalPage) {
    echo '<li class="disabled"><a href="#">&raquo;</a></li>';
} else {
    echo '<li><a href="?pageNum='.$totalPage.'">&raquo;</a></li>';
}
echo '</ul>';

以上就是PHP分页效率终结版(推荐)的完整攻略,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP分页效率终结版(推荐) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 如何在Python中查询MySQL数据库中的数据?

    以下是在Python中查询MySQL数据库中的数据的完整使用攻略。 查询MySQL数据库中的数据简介 在Python中,可以使用mysql.connector模块连接MySQL数据库,并使用SELECT语句查询数据。查询结果可以使用游标对象fetchall()方法获取。 步骤1:导入模块 在Python中,使用mysql.connector模块连接MySQL…

    python 2023年5月12日
    00
  • MySQL删除表数据的方法

    下面我来详细讲解一下MySQL删除表数据的方法。 方法一:DELETE语句 使用DELETE语句可以删除表中符合条件的数据。 DELETE FROM table_name WHERE condition; 其中,table_name是要删除数据的表名,condition是删除数据的条件。如果没有条件,则会删除表中所有数据。下面是一个示例: 假设我们有一个名为…

    database 2023年5月22日
    00
  • JDBC连接Mysql的5种方式实例总结

    首先我们需要理解什么是JDBC连接Mysql。 JDBC是Java Database Connectivity的缩写,它是Java中连接数据库的标准API,可以通过JDBC来访问各种各样的关系型数据库。而Mysql是一种关系型数据库,是目前开发中常用的一种数据库之一。 下面将分别讲解五种JDBC连接Mysql的方式: 1.使用JDBC Driver Mana…

    database 2023年5月22日
    00
  • MySQL中order by的使用详情

    MySQL中的ORDER BY语句可以用于对查询结果进行排序。下面是使用ORDER BY的完整攻略,包含如何使用ORDER BY进行排序、如何使用多列排序以及如何限制排序结果数量等。 基本语法 ORDER BY语句用于对查询结果进行排序,其基本语法如下: SELECT column1, column2, … FROM table_name [WHERE …

    database 2023年5月22日
    00
  • 一千行的MySQL学习笔记汇总

    一千行的MySQL学习笔记汇总是一个非常全面的MySQL学习资源,旨在帮助初学者快速入门和深入理解MySQL数据库。接下来,我将为您介绍如何使用这个资源,包括获取和使用该笔记的步骤。 获取一千行的MySQL学习笔记汇总 打开GitHub,搜索“一千行的MySQL学习笔记汇总”或者直接访问https://github.com/it-interview/Easy…

    database 2023年5月22日
    00
  • SpringBoot怎么整合Redis实现序列化存储Java对象

    今天小编给大家分享一下SpringBoot怎么整合Redis实现序列化存储Java对象的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 一、背景 1、思考 通过我们前面的学习,我们已经可以往 Redis 中存入字符串,那么我们要往 Redis 中…

    2023年4月10日
    00
  • 解析探秘fescar分布式事务实现原理

    解析探秘fescar分布式事务实现原理 分布式事务是一个难点,因为分布式事务牵涉到多个不同的计算节点之间的协作,要实现一个高效且可靠的分布式事务控制系统并不是一件容易的事。在这篇文章中,我们将讲解如何解析探秘fescar分布式事务实现原理,并通过两个示例说明其工作原理。 什么是fescar fescar是一个基于Java的分布式事务解决方案,旨在解决分布式事…

    database 2023年5月21日
    00
  • PHP连接MYSQL数据库的3种常用方法

    下面为你详细介绍 PHP 连接 MYSQL 数据库的 3 种常用方法。 方法一:使用 mysqli 扩展 确保mysqli扩展已启用,可以通过查看php.ini文件或使用 phpinfo() 函数来检查 使用 mysqli_connect() 函数连接到 MYSQL 数据库,该函数有4个参数,分别是主机名、用户名、密码和数据库名,如下所示: $link = …

    database 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部