编程 PHP中使用PDO和mysqli实现MySQL数据的分页

2024-11-18 16:01:42 +0800 CST views 525

在PHP中处理分页是展示大量数据时常用的技术,特别是在读取MySQL数据时,分页能够显著提高页面加载速度和用户体验。下面我们会详细介绍使用PDO和mysqli两种方式实现分页读取MySQL数据,并且包括处理指定字段数据分页的案例。

一、多行数据的分页技术

1. 使用PDO进行分页

使用PDO进行分页可以有效避免SQL注入,并且通过预准备语句和参数绑定来处理分页逻辑。

示例代码:

<?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进行分页

mysqli是一种常见的MySQL访问方式,下面展示如何使用它进行分页查询。

示例代码:

<?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']) ? (int)$_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>';  
}  
  
// 计算总页数  
$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();  
?>

在这两段代码中,我们通过 LIMITOFFSET 实现分页功能,展示了一定数量的数据,并且使用循环来生成分页链接。

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

当内容过长时,我们可以对文章进行分页展示。以下是处理超过2000字的文章分页展示的完整案例:

示例代码:

<?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的文章内容后,如果文章超过2000字,通过 <--nextpage--> 标记来分割内容,实现分页展示。否则,直接显示全文。

总结

通过以上PDO和mysqli的分页实现方法,可以帮助我们轻松处理大数据量的MySQL数据展示,同时提高页面的加载性能。对于文章类长内容的分页,我们可以根据内容的长度进行智能分页展示,从而优化用户体验。

复制全文 生成海报 编程 数据库 Web开发 PHP 用户体验

推荐文章

PHP 8.4 中的新数组函数
2024-11-19 08:33:52 +0800 CST
JS 箭头函数
2024-11-17 19:09:58 +0800 CST
JavaScript数组 splice
2024-11-18 20:46:19 +0800 CST
Vue中如何处理异步更新DOM?
2024-11-18 22:38:53 +0800 CST
7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
Nginx 负载均衡
2024-11-19 10:03:14 +0800 CST
Redis和Memcached有什么区别?
2024-11-18 17:57:13 +0800 CST
介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
前端项目中图片的使用规范
2024-11-19 09:30:04 +0800 CST
前端代码规范 - Commit 提交规范
2024-11-18 10:18:08 +0800 CST
程序员茄子在线接单