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

yizhihongxing

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日

相关文章

  • 几种MySQL中的联接查询操作方法总结

    几种MySQL中的联接查询操作方法总结 在MySQL中,联接查询是非常常见的操作,它可以将多个数据表中的数据合并在一起,能够满足复杂查询的需求。本文总结了几种MySQL中的联接查询操作方法,希望能为读者提供一些参考。 内连接查询(INNER JOIN) 内连接查询是联接操作中最常用的一种方法。它会将多个表中共有的数据记录连接在一起,只输出同时存在于这些表中的…

    database 2023年5月22日
    00
  • 详细介绍Linux IO

    详细介绍Linux IO Linux内核IO子系统负责管理计算机系统与外部设备之间的交互(输入输出操作)。接下来,我们将详细介绍Linux IO的相关知识。 IO模型 在Linux中,IO模型可以分为5种具体类型:- 阻塞IO- 非阻塞IO- IO复用- 信号驱动IO- 异步IO 阻塞IO(Blocking IO) 阻塞IO是一种最简单的IO模型。应用程序在…

    database 2023年5月22日
    00
  • pgsql 如何删除仍有活动链接的数据库

    要删除仍有活动连接的 PostgreSQL 数据库,需要先断开该数据库的所有已连接会话,然后再执行删除操作。具体步骤如下: 查询当前连接到该数据库的会话 可以使用以下 SQL 查询语句来查看当前连接到该数据库的所有会话: SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activi…

    database 2023年5月18日
    00
  • Java编程中的条件判断之if语句的用法详解

    Java编程中的条件判断之if语句的用法详解 在Java编程中,我们经常需要根据不同的条件来进行不同的操作,这时候就需要用到条件语句。if语句就是应用最广泛、最基本的条件判断语句。 if语句的语法 Java中if语句的语法如下: if (条件表达式) { // 条件表达式为真时执行的语句 } 其中,条件表达式的值只有两个可能结果:true或false。如果条…

    database 2023年5月22日
    00
  • MySQL中设置NULL和空白字符串的问题及解决

    MySQL中设置NULL和空白字符串的问题及解决 在MySQL中,我们经常需要使用NULL和空白字符串两种特殊值。但是,在一些情况下,它们的使用可能会出现问题。本文将针对这一问题给出详细的解释和解决方案。 问题1:NULL值和空白字符串的区别 在MySQL中,NULL表示空值,而空白字符串表示一个长度为零的字符串。它们之间的区别是显而易见的,但是在使用的时候…

    database 2023年5月22日
    00
  • ASP+PHP 标准sql注入语句(完整版)

    ASP+PHP标准SQL注入攻略 SQL注入是一种常见的Web应用程序安全漏洞,黑客可以通过SQL注入攻击获取目标网站的数据,进而构造更高级的攻击。下面是ASP+PHP标准SQL注入语句的攻略。 一、概述 SQL注入是通过Web应用程序的输入页面往后台发送恶意SQL语句,从而导致数据库被攻击者控制的过程。 黑客通常使用特定结构的字符串来通过应用程序获取敏感信…

    database 2023年5月21日
    00
  • MSSQL中递归SQL查询语句实例说明-

    现在我来详细讲解“MSSQL中递归SQL查询语句实例说明”的完整攻略。 MSSQL中递归SQL查询语句实例说明 什么是递归查询 递归查询是指在一个数据集或表中,通过递归方法逐行查询所需要的数据。这种查询方式通常用于树形结构数据的查询。 MSSQL递归查询语句 MSSQL中的递归查询语句是使用WITH RECURSIVE关键字,然后一次性给出递归查询需要使用的…

    database 2023年5月21日
    00
  • MySql中JOIN的用法示例详解

    MySql中JOIN的用法示例详解 在本文中,我们将详细讲解MySql中JOIN的用法和示例。JOIN语句是关系型数据库中非常重要的一种操作,可以方便地将多个表中的数据关联起来,进行复杂的查询和统计。 JOIN语句的基本用法 JOIN语句可以连接两个或多个数据表,根据共同的字段将它们的数据关联起来。 在JOIN语句中,需要指定连接的方式(INNER JOIN…

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