使用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字,我们就直接显示整个文章内容。
原创文章,作者:howkunet,如若转载,请注明出处:https://www.intoep.com/program/63731.html