
本文将详细介绍如何使用php和mysql实现数据库查询结果的分页显示功能。通过计算总记录数、确定每页显示数量以及动态生成sql `limit` 子句,我们将构建一个完整的后端逻辑,并结合html/css创建交互式分页导航。本教程涵盖从数据查询到页面渲染的全过程,旨在帮助开发者高效管理大量数据展示。
在Web开发中,当数据库查询结果集非常庞大时,一次性加载所有数据不仅效率低下,还会严重影响用户体验。因此,实现数据的分页显示成为一项基本且重要的功能。本教程将指导您如何利用PHP和MySQL的强大能力,结合HTML和CSS,构建一个健壮、高效且用户友好的分页系统。
数据分页的核心思想是将一个大型结果集分割成多个较小的、可管理的页面。这通常涉及到以下几个关键概念:
我们将使用PHP来处理数据库交互和分页逻辑。假设您已经建立了一个名为 $conn 的MySQLi数据库连接。
首先,我们需要查询数据库中符合条件的总记录数,以便计算出总页数。
立即学习“PHP免费学习笔记(深入)”;
<?php
// 假设 $conn 已经是一个有效的 MySQLi 数据库连接
// 查询总记录数
$sql_count = "SELECT COUNT(*) AS total_rows FROM Special_Infected_Kills";
$result_count = $conn->query($sql_count);
if ($result_count) {
$row_count = $result_count->fetch_assoc();
$total_rows = $row_count['total_rows']; // 数据库中的总记录数
} else {
$total_rows = 0;
// 错误处理
error_log("查询总记录数失败: " . $conn->error);
}
?>接下来,根据总记录数和预设的每页显示数量,计算出总页数以及当前页面的偏移量。
<?php
// ... (接上一步代码)
$pagesize = 20; // 每页显示20条记录
// 计算总页数
$total_pages = ceil($total_rows / $pagesize);
// 获取当前页码,默认为第一页
$current_page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT) ?: 1;
// 确保当前页码在有效范围内(1 到 $total_pages 之间)
$current_page = max(1, min($current_page, $total_pages > 0 ? $total_pages : 1));
// 计算 SQL 查询的起始偏移量
$offset = ($current_page - 1) * $pagesize;
// 如果没有记录,确保 offset 不为负
if ($total_rows == 0) {
$offset = 0;
}
?>解释:
使用计算出的 $offset 和 $pagesize 来构建带有 LIMIT 子句的SQL查询。为了防止SQL注入,我们强烈建议使用预处理语句。
<?php
// ... (接上一步代码)
$sql_data = "SELECT
STEAM_ID, Hunters, Smoker, Boomers, Spitters, Jockeys, Charger,
(Hunters + Smoker + Boomers + Spitters + Jockeys + Charger) AS Total_Kills
FROM Special_Infected_Kills
ORDER BY Total_Kills DESC
LIMIT ?, ?"; // 占位符用于 offset 和 pagesize
// 准备语句
$stmt = $conn->prepare($sql_data);
if ($stmt) {
// 绑定参数:'ii' 表示两个参数都是整数
$stmt->bind_param('ii', $offset, $pagesize);
// 执行语句
$stmt->execute();
// 绑定结果到变量
$stmt->bind_result($sid, $hunters, $smoker, $boomers, $spitters, $jockeys, $charger, $total_kills);
$output_table = '
<table>
<tr>
<th>Player</th>
<th>Total Kills</th>
<th>Hunter</th>
<th>Jockey</th>
<th>Charger</th>
<th>Smoker</th>
<th>Boomer</th>
<th>Spitter</th>
</tr>';
// 遍历结果集并生成表格行
while ($stmt->fetch()) {
$output_table .= sprintf('
<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
</tr>',
htmlspecialchars($sid),
htmlspecialchars($total_kills),
htmlspecialchars($hunters),
htmlspecialchars($jockeys),
htmlspecialchars($charger),
htmlspecialchars($smoker),
htmlspecialchars($boomers),
htmlspecialchars($spitters)
);
}
$output_table .= '</table>';
$stmt->close(); // 关闭语句
} else {
$output_table = "<p>数据查询失败: " . $conn->error . "</p>";
error_log("准备SQL语句失败: " . $conn->error);
}
?>解释:
现在,我们已经获取了当前页的数据,并将其格式化为HTML表格。接下来,我们需要创建分页导航链接,让用户可以在不同页面之间切换。
<?php
// ... (接上一步代码)
// 生成分页链接
$footer_pagination = '
<footer>
<div class="center">
<div class="pagination">';
// "首页" 和 "上一页" 链接
$first_link = ($current_page > 1) ? '<a class="paging" href="?page=1">首页</a>' : '<span class="paging-disabled">首页</span>';
$prev_page = max(1, $current_page - 1);
$prev_link = ($current_page > 1) ? sprintf('<a class="paging" href="?page=%d">上一页</a>', $prev_page) : '<span class="paging-disabled">上一页</span>';
$footer_pagination .= sprintf('<div>%s | %s', $first_link, $prev_link);
// 数字页码链接
for ($i = 1; $i <= $total_pages; $i++) {
$active_class = ($current_page == $i) ? ' active' : '';
$footer_pagination .= sprintf(' <a class="paging%2$s" href="?page=%1$d">%1$d</a> ', $i, $active_class);
}
// "下一页" 和 "末页" 链接
$next_page = min($total_pages, $current_page + 1);
$next_link = ($current_page < $total_pages) ? sprintf('<a class="paging" href="?page=%d">下一页</a>', $next_page) : '<span class="paging-disabled">下一页</span>';
$last_link = ($current_page < $total_pages) ? sprintf('<a class="paging" href="?page=%d">末页</a>', $total_pages) : '<span class="paging-disabled">末页</span>';
$footer_pagination .= sprintf(' | %s | %s</div>', $next_link, $last_link);
$footer_pagination .= '
</div>
</div>
<div class="createdby">
<p>Website built & designed by Blade</p>
</div>
</footer>';
// 渲染所有内容
echo $output_table;
echo $footer_pagination;
$conn->close(); // 关闭数据库连接
?>解释:
将上述所有代码片段组合起来,形成一个完整的 index.php 文件(或其他您希望的文件名)。
<?php
// 假设您的数据库连接配置
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 1. 获取总记录数
$sql_count = "SELECT COUNT(*) AS total_rows FROM Special_Infected_Kills";
$result_count = $conn->query($sql_count);
if ($result_count) {
$row_count = $result_count->fetch_assoc();
$total_rows = $row_count['total_rows'];
} else {
$total_rows = 0;
error_log("查询总记录数失败: " . $conn->error);
}
// 2. 分页参数计算
$pagesize = 20; // 每页显示20条记录
// 计算总页数,如果没有记录,至少有一页
$total_pages = ceil($total_rows / $pagesize);
if ($total_rows == 0) {
$total_pages = 1; // 至少显示一页,即使没有数据
}
// 获取当前页码,默认为第一页
$current_page = filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT) ?: 1;
// 确保当前页码在有效范围内
$current_page = max(1, min($current_page, $total_pages));
// 计算 SQL 查询的起始偏移量
$offset = ($current_page - 1) * $pagesize;
// 3. 构建分页查询并获取数据
$sql_data = "SELECT
STEAM_ID, Hunters, Smoker, Boomers, Spitters, Jockeys, Charger,
(Hunters + Smoker + Boomers + Spitters + Jockeys + Charger) AS Total_Kills
FROM Special_Infected_Kills
ORDER BY Total_Kills DESC
LIMIT ?, ?";
$stmt = $conn->prepare($sql_data);
$output_table = '';
if ($stmt) {
$stmt->bind_param('ii', $offset, $pagesize);
$stmt->execute();
$stmt->bind_result($sid, $hunters, $smoker, $boomers, $spitters, $jockeys, $charger, $total_kills);
$output_table = '
<table>
<tr>
<th>Player</th>
<th>Total Kills</th>
<th>Hunter</th>
<th>Jockey</th>
<th>Charger</th>
<th>Smoker</th>
<th>Boomer</th>
<th>Spitter</th>
</tr>';
while ($stmt->fetch()) {
$output_table .= sprintf('
<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%s</td>
</tr>',
htmlspecialchars($sid),
htmlspecialchars($total_kills),
htmlspecialchars($hunters),
htmlspecialchars($jockeys),
htmlspecialchars($charger),
htmlspecialchars($smoker),
htmlspecialchars($boomers),
htmlspecialchars($spitters)
);
}
$output_table .= '</table>';
$stmt->close();
} else {
$output以上就是PHP与MySQL:实现数据库查询结果分页显示详解的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号