0

0

PHP与MySQL:实现数据库查询结果分页显示详解

碧海醫心

碧海醫心

发布时间:2025-11-29 11:40:02

|

385人浏览过

|

来源于php中文网

原创

PHP与MySQL:实现数据库查询结果分页显示详解

本文将详细介绍如何使用phpmysql实现数据库查询结果的分页显示功能。通过计算总记录数、确定每页显示数量以及动态生成sql `limit` 子句,我们将构建一个完整的后端逻辑,并结合html/css创建交互式分页导航。本教程涵盖从数据查询到页面渲染的全过程,旨在帮助开发者高效管理大量数据展示。

在Web开发中,当数据库查询结果集非常庞大时,一次性加载所有数据不仅效率低下,还会严重影响用户体验。因此,实现数据的分页显示成为一项基本且重要的功能。本教程将指导您如何利用PHP和MySQL的强大能力,结合HTML和CSS,构建一个健壮、高效且用户友好的分页系统。

核心概念与原理

数据分页的核心思想是将一个大型结果集分割成多个较小的、可管理的页面。这通常涉及到以下几个关键概念:

  1. 总记录数 (Total Records):数据库中符合查询条件的总条目数。这是计算总页数的基础。
  2. 每页显示数量 (Page Size):每个页面希望显示的数据条目数。
  3. 总页数 (Total Pages):根据总记录数和每页显示数量计算出的总页面数量。
  4. 当前页码 (Current Page):用户当前正在查看的页面编号。
  5. SQL LIMIT 子句:MySQL(以及其他SQL数据库)提供 LIMIT offset, row_count 子句,用于从结果集中跳过 offset 条记录,然后返回 row_count 条记录。这是实现分页查询的关键。

后端数据处理:PHP与MySQL

我们将使用PHP来处理数据库交互和分页逻辑。假设您已经建立了一个名为 $conn 的MySQLi数据库连接。

1. 获取总记录数

首先,我们需要查询数据库中符合条件的总记录数,以便计算出总页数。

立即学习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);
}
?>

2. 分页参数计算

接下来,根据总记录数和预设的每页显示数量,计算出总页数以及当前页面的偏移量。

<?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;
}
?>

解释:

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载
  • filter_input(INPUT_GET, 'page', FILTER_SANITIZE_NUMBER_INT) 安全地获取URL中的 page 参数,并将其转换为整数。
  • ?: 1 是PHP 7+ 的 null 合并运算符,如果 page 参数不存在或无效,则默认设置为 1。
  • max(1, min($current_page, $total_pages > 0 ? $total_pages : 1)) 确保 $current_page 始终是一个有效的页码。如果 $total_pages 为 0(即没有记录),则将其限制为 1。
  • $offset 是 LIMIT 子句需要的起始位置,它是基于0的索引。

3. 构建分页查询并获取数据

使用计算出的 $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);
}
?>

解释:

  • LIMIT ?, ? 使用问号作为占位符,分别对应 offset 和 pagesize。
  • $conn->prepare($sql_data) 创建一个预处理语句对象。
  • $stmt->bind_param('ii', $offset, $pagesize) 将变量绑定到占位符。'ii' 指定了两个参数都是整数类型。
  • $stmt->execute() 执行查询。
  • $stmt->bind_result(...) 将查询结果的每一列绑定到指定的PHP变量。
  • while ($stmt->fetch()) 循环遍历结果集,每次迭代都会将当前行的数据填充到绑定的变量中。
  • htmlspecialchars() 用于防止XSS攻击,确保输出到HTML的内容是安全的。

前端页面渲染与分页导航

现在,我们已经获取了当前页的数据,并将其格式化为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(); // 关闭数据库连接
?>

解释:

  • 我们动态生成 "首页"、"上一页"、"下一页" 和 "末页" 链接。如果当前页是第一页,"首页"和"上一页"会显示为不可点击的文本(或带有禁用样式)。同理,末页也是如此。
  • 数字页码循环从1到 $total_pages。当前页码的链接会添加 active 类,以便通过CSS进行样式高亮。
  • 所有链接都使用 ?page=X 的URL格式来传递页码参数。

完整示例代码

将上述所有代码片段组合起来,形成一个完整的 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速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2174

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1683

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号