PHP分页技巧:php如何分页读取mysql数据

分页是一种常见的技术,用于在大量数据中仅显示一部分数据,从而提高网站的性能和用户体验。在PHP中,连接MYSQL数据的方法有PDO和mysqli两种方式,本文通过几个简单的案例代码来介绍PDO和mysqli的分页方式。

使用PHP搭配mysql数据库,是很多网站最常见的储存数据和读取数据的方法。当我们自己用PHP读取mysql数据库的时候,如果读取的数据过大,展现内容的时候就会出现加载很慢甚至网页崩溃的情况。这时候我们如果对需要展示的内容进行分页处理,可能就会好很多。

分页是一种常见的技术,用于在大量数据中仅显示一部分数据,从而提高网站的性能和用户体验。在PHP中,连接MYSQL数据的方法有PDO和mysqli两种方式,本文通过几个简单的案例代码来介绍PDO和mysqli的分页方式。

一、多行数据的分页技术

1、使用PDO进行分页

<?php  
// 数据库连接信息  
$host = 'localhost';  
$db = 'test_db';  
$user = 'root';  
$pass = '';  
$charset = 'utf8mb4';  
  
// 创建PDO连接  
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";  
$options = [  
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,  
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,  
    PDO::ATTR_EMULATE_PREPARES => false,  
];  
$pdo = new PDO($dsn, $user, $pass, $options);  
  
// 设置每页显示的记录数  
$limit = 10;  
  
// 获取当前页码  
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;  
  
// 计算偏移量  
$offset = ($page - 1) * $limit;  
  
// SQL查询语句  
$sql = "SELECT * FROM `my_table` LIMIT :limit OFFSET :offset";  
  
// 预准备语句  
$stmt = $pdo->prepare($sql);  
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);  
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);  
  
// 执行查询  
$stmt->execute();  
  
// 获取分页数据  
$rows = $stmt->fetchAll();  
  
// 展示数据  
foreach ($rows as $row) {  
    echo $row['id'] . ' ' . $row['name'] . '<br>';  
}  
  
// 计算总页数  
$totalRecords = $pdo->query("SELECT COUNT(*) FROM `my_table`")->fetchColumn();  
$totalPages = ceil($totalRecords / $limit);  
  
// 显示分页链接(简化示例)  
echo '<div>Pages: ';  
for ($i = 1; $i <= $totalPages; $i++) {  
    echo '<a href="?page=' . $i . '">' . $i . '</a> ';  
}  
echo '</div>';  
?>

2、使用mysqli进行分页

<?php// 数据库连接信息$host = 'localhost';  
$db   = 'test_db';  
$user = 'root';  
$pass = '';  
  
// 连接数据库  
$conn = new mysqli($host, $user, $pass, $db);  
  
// 检查连接  
if ($conn->connect_error) {  
    die("连接失败: " . $conn->connect_error);  
}  
  
// 设置每页显示的记录数  
$limit = 10;  
  
// 获取当前页码  
$page = isset($_GET['page']) ? $_GET['page'] : 1;  
  
// 计算偏移量  
$offset = ($page - 1) * $limit;  
  
// SQL查询语句  
$sql = "SELECT * FROM `my_table` LIMIT ? OFFSET ?";  
  
// 准备语句  
$stmt = $conn->prepare($sql);  
  
// 绑定参数  
$stmt->bind_param("ii", $limit, $offset);  
  
// 执行查询  
$stmt->execute();  
  
// 获取分页数据  
$rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);  
  
// 展示数据  
foreach ($rows as $row) {  
    echo $row['id'] . ' ' . $row['name'] . '<br>';  
}  
  
// 计算总页数(假设每页10条记录,总记录数为$totalRecords)  
$totalRecords = $conn->query("SELECT COUNT(*) FROM `my_table`")->fetch_row()[0];  
$totalPages = ceil($totalRecords / $limit);  
  
// 显示分页链接(简化示例)  
echo '<div>Pages: ';  
for ($i = 1; $i <= $totalPages; $i++) {  
    echo '<a href="?page=' . $i . '">' . $i . '</a> ';  
}  
echo '</div>';  
  
// 关闭语句和连接  
$stmt->close();  
$conn->close();  
?>

当然,在我们处理分页的同时,可能还伴随着其他条件的筛选,比如分类、标签、时间等等。比如:

$sortField = isset($_GET['sort']) ? $_GET['sort'] : 'id'; 
$sortOrder = isset($_GET['order']) ? $_GET['order'] : 'ASC';

请注意,上面两段案例代码中都使用了预处理语句和参数绑定来防止SQL注入攻击。以上代只是码展示了如何使用mysqli进行基础的分页查询。接下来,我们还可以使用了预处理语句和参数绑定的同时,加入排序参数等手段。用户可以通过URL传递sort和order参数来控制排序方式。

第二、指定字段数据的分页处理

当我们某一篇文章太长,影响道页面的加载速度和浏览体验的时候,我们可对超过指定长度的文章进行分页。比如我们某一篇文章超过2000字,我们就需要进行分页处理,处理规则是每一页字数不超过2000字。

下面我们通过一个使用PHP和mysqli进行分页显示文章的完整案例代码来进行介绍。这个案例假设你有一个名为articles的数据表,其中包含id和content字段。

<?php  
// 数据库连接信息  
$host = 'localhost';  
$db   = 'your_database';  
$user = 'root';  
$pass = '';  
  
// 创建mysqli连接  
$conn = new mysqli($host, $user, $pass, $db);  
  
// 检查连接  
if ($conn->connect_error) {  
    die("连接失败: " . $conn->connect_error);  
}  
  
// 文章ID  
$articleId = 1; // 假设我们要展示的文章ID是1  
  
// SQL查询语句,获取指定文章内容  
$sql = "SELECT `content` FROM `articles` WHERE `id` = ?";  
  
// 准备语句  
$stmt = $conn->prepare($sql);  
  
// 绑定参数  
$stmt->bind_param("i", $articleId);  
  
// 执行查询  
$stmt->execute();  
  
// 获取文章内容  
$row = $stmt->get_result()->fetch_assoc();  
  
// 检查文章内容长度  
if (strlen($row['content']) > 2000) {  
    // 文章内容超过2000字,进行分页  
    $contentParts = explode('<!--nextpage-->', $row['content']);  
    $currentPart = 0;  
  
    // 初始化分页变量  
    $currentPage = isset($_GET['page']) ? $_GET['page'] : 1;  
    $partsPerPage = 2;  
    $totalParts = count($contentParts);  
  
    // 计算当前页应该显示的部分  
    $startPart = ($currentPage - 1) * $partsPerPage;  
    $endPart = $startPart + $partsPerPage - 1;  
  
    // 确保部分索引在范围内  
    $startPart = max(0, $startPart);  
    $endPart = min($totalParts - 1, $endPart);  
  
    // 显示分页内容  
    for ($i = $startPart; $i <= $endPart; $i++) {  
        if (isset($contentParts[$i])) {  
            echo "<p>{$contentParts[$i]}</p>";  
        }  
    }  
  
    // 显示分页链接  
    for ($i = 1; $i <= ceil($totalParts / $partsPerPage); $i++) {  
        echo "<a href='?page=" . $i . "'>第 " . $i . " 页</a> ";  
    }  
} else {  
    // 文章内容不超过2000字,直接显示  
    echo "<h2>文章标题</h2>"; // 注意:这里假设您有一个方法来获取文章标题,但当前代码只显示了内容  
    echo "<p>{$row['content']}</p>";  
}  
  
// 关闭语句和连接  
$stmt->close();  
$conn->close();  
?>

在这个案例中,我们首先连接到数据库,然后指定要读取的文章ID。我们执行一个SQL查询来获取指定文章的内容。如果文章内容超过2000字,我们使用<!–nextpage–>作为分隔符来分割文章内容,并在每个页面上显示一部分内容。如果文章内容不超过2000字,我们就直接显示整个文章内容。

 

Intoep小程序

微信扫一扫,打开小程序浏览更便捷

原创文章,作者:howkunet,如若转载,请注明出处:https://www.intoep.com/program/63731.html

发表回复

登录后才能评论