php实现一个简单的MySQL分页

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。

PHP实现一个简单的MySQL分页

分页是Web应用中常见的功能,尤其是当需要展示大量数据时,通过分页可以有效地提升用户体验和减少服务器负担。本文将介绍如何使用PHP实现一个简单的MySQL分页功能。

一、数据库准备

首先,确保你已经准备好了一个MySQL数据库和相应的数据表。假设我们有一个名为 articles的数据表,用于存储文章信息。

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入一些示例数据
INSERT INTO articles (title, content) VALUES 
('Article 1', 'Content for article 1'),
('Article 2', 'Content for article 2'),
('Article 3', 'Content for article 3'),
('Article 4', 'Content for article 4'),
('Article 5', 'Content for article 5'),
('Article 6', 'Content for article 6'),
('Article 7', 'Content for article 7'),
('Article 8', 'Content for article 8');
​

二、分页逻辑

分页的核心逻辑在于通过SQL的 LIMITOFFSET关键字来控制查询结果的数量和起始位置。

1. 计算总记录数

首先,计算数据表中的总记录数,用于计算总页数。

<?php
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'root';
$password = '';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 计算总记录数
    $stmt = $pdo->query('SELECT COUNT(*) FROM articles');
    $totalRecords = $stmt->fetchColumn();
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
?>
​

2. 设置分页参数

设置分页参数,包括当前页码和每页显示的记录数。

<?php
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 5; // 每页显示的记录数

$totalPages = ceil($totalRecords / $perPage); // 计算总页数

if ($page < 1) {
    $page = 1;
} elseif ($page > $totalPages) {
    $page = $totalPages;
}

$offset = ($page - 1) * $perPage;
?>
​

3. 查询当前页的数据

使用 LIMITOFFSET查询当前页的数据。

<?php
try {
    $stmt = $pdo->prepare('SELECT * FROM articles ORDER BY created_at DESC LIMIT :limit OFFSET :offset');
    $stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();

    $articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo 'Query failed: ' . $e->getMessage();
}
?>
​

三、显示分页结果

1. 显示文章列表

遍历查询结果,显示文章列表。

<?php foreach ($articles as $article): ?>
    <h2><?php echo htmlspecialchars($article['title'], ENT_QUOTES, 'UTF-8'); ?></h2>
    <p><?php echo nl2br(htmlspecialchars($article['content'], ENT_QUOTES, 'UTF-8')); ?></p>
    <hr>
<?php endforeach; ?>
​

2. 显示分页链接

生成分页链接,允许用户在不同页之间导航。

<div>
    <?php if ($page > 1): ?>
        <a href="?page=<?php echo $page - 1; ?>">Previous</a>
    <?php endif; ?>

    <?php for ($i = 1; $i <= $totalPages; $i++): ?>
        <a href="?page=<?php echo $i; ?>"<?php if ($i === $page) echo ' style="font-weight:bold;"'; ?>><?php echo $i; ?></a>
    <?php endfor; ?>

    <?php if ($page < $totalPages): ?>
        <a href="?page=<?php echo $page + 1; ?>">Next</a>
    <?php endif; ?>
</div>
​

四、完整示例代码

整合上述代码,形成一个完整的分页示例:

<?php
$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'root';
$password = '';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 计算总记录数
    $stmt = $pdo->query('SELECT COUNT(*) FROM articles');
    $totalRecords = $stmt->fetchColumn();

    $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
    $perPage = 5; // 每页显示的记录数

    $totalPages = ceil($totalRecords / $perPage); // 计算总页数

    if ($page < 1) {
        $page = 1;
    } elseif ($page > $totalPages) {
        $page = $totalPages;
    }

    $offset = ($page - 1) * $perPage;

    $stmt = $pdo->prepare('SELECT * FROM articles ORDER BY created_at DESC LIMIT :limit OFFSET :offset');
    $stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
    $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();

    $articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Article List</title>
</head>
<body>

<?php foreach ($articles as $article): ?>
    <h2><?php echo htmlspecialchars($article['title'], ENT_QUOTES, 'UTF-8'); ?></h2>
    <p><?php echo nl2br(htmlspecialchars($article['content'], ENT_QUOTES, 'UTF-8')); ?></p>
    <hr>
<?php endforeach; ?>

<div>
    <?php if ($page > 1): ?>
        <a href="?page=<?php echo $page - 1; ?>">Previous</a>
    <?php endif; ?>

    <?php for ($i = 1; $i <= $totalPages; $i++): ?>
        <a href="?page=<?php echo $i; ?>"<?php if ($i === $page) echo ' style="font-weight:bold;"'; ?>><?php echo $i; ?></a>
    <?php endfor; ?>

    <?php if ($page < $totalPages): ?>
        <a href="?page=<?php echo $page + 1; ?>">Next</a>
    <?php endif; ?>
</div>

</body>
</html>
​

五、总结

通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
关系型数据库 MySQL Unix
PHP MySql 安装与连接
PHP MySql 安装与连接
225 0
|
SQL 存储 关系型数据库
为什么PHP需要和MySQL一起用?底层原理是什么?
为什么PHP需要和MySQL一起用?底层原理是什么?
401 0
|
关系型数据库 MySQL PHP
PHP处理MySQL关联查询
什么关联查询? a)在MySQL中的Select语句中,我们经常会有复杂的业务需要使用join子语句,包括left join、right join、inner join、left outer join、right outer join、full join b)那么使用以上几种方式进行表查询的时候、对数据库的压力是很大的,怎么个大法呢,我们来测试一下: i.首先我们先搞一些数据 class表200w数据 user表 40w数据 ii.我们接下来查询15个班级下面的所有学生
|
SQL 关系型数据库 MySQL
PHP中MySQL操作
本次使用的demo是MySQL的示例数据库employees,点击下载地址,注意在导入的时候,在employees.sql文件中,将source改成你当前的目录。
PHP中MySQL操作
|
NoSQL 关系型数据库 MySQL
使用PHP生成MySQL数据字典
给大家分享一个自己写的函数:使用PHP生成mysql字典。
191 0
使用PHP生成MySQL数据字典
|
PHP
PHP Mysql
PHP Mysql
136 0
|
SQL Web App开发 Java
MySQL PHP 语法
MySQL PHP 语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP。 在这些语言中,Mysql在PHP的web开发中是应用最广泛。 在本教程中我们大部分实例都采用了 PHP 语言。
793 0
|
关系型数据库 MySQL PHP
PHP MySQL 连接数据库
PHP MySQL 连接数据库 免费的 MySQL 数据库通常是通过 PHP 来使用的。   连接到一个 MySQL 数据库   在您能够访问并处理数据库中的数据之前,您必须创建到达数据库的连接。 在 PHP 中,这个任务通过 mysql_connect() 函数完成。
1772 0
|
Web App开发 关系型数据库 测试技术
|
SQL 关系型数据库 MySQL