在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();
?>
在这两段代码中,我们通过 LIMIT
和 OFFSET
实现分页功能,展示了一定数量的数据,并且使用循环来生成分页链接。
二、指定字段数据的分页处理
当内容过长时,我们可以对文章进行分页展示。以下是处理超过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数据展示,同时提高页面的加载性能。对于文章类长内容的分页,我们可以根据内容的长度进行智能分页展示,从而优化用户体验。