PHP实现一个简单的MySQL分页

news/2025/1/30 13:34:31/文章来源:https://www.cnblogs.com/cnblogsisgod/p/18695137

分页是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的 LIMIT和 OFFSET关键字来控制查询结果的数量和起始位置。

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. 查询当前页的数据

使用 LIMIT和 OFFSET查询当前页的数据。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877036.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka 的部署(单机和集群)和 SpringBoot 访问

Kafka 由 Scala 和 Java 编写,最初由 LinkedIn 开发,后来成为 Apache 顶级项目,是一种高吞吐量的分布式发布/订阅消息系统。 Kafka 不仅仅是一个消息队列,还支持实时数据处理,其高吞吐、可扩展和持久化特性使其在大数据领域广泛应用。 本篇博客不详细介绍 Kafka,主要聚焦…

DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」

前言 最近 DeepSeek 狠狠刷了一波屏,国产大模型真的越来越厉害了👍,官方的服务器已经爆满了,以至于频繁出现反应迟缓甚至宕机的情况,和两年多之前 ChatGPT 的遭遇颇为相似。 我已经好久没有本地部署模型了(现在各厂商的模型都便宜量大),这次正好来试试 DeepSeek 开源模…

CF1000

A link首先,对于一个数(比如说\(x\)),它和它加一一定互质(也就是\(x\)和\(x+1\)一定互质),那么它和它加一组成的区间(\([x,x+1]\))一定是好区间,也一定是最小好区间,因为除了本身\([x,x+1]\)、两个数\([x,x]\),\([x+1,x+1]\)和空集不包含其他区间了,而相等两个数一…

大模型

目录大模型的演变大模型的使用与训练大模型的特点与分类大模型的工作流程大模型的应用 大模型的演变机器学习:深度学习:大模型的使用与训练 大模型的特点与分类 大模型的工作流程 大模型的应用本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.co…

“星门计划对AI未来的意义——以及谁将掌控它”

“星门计划对AI未来的意义——以及谁将掌控它”图片由DALL-E 3生成就在几天前,唐纳德特朗普宣布了“星门计划”,OpenAI随即跟进,分享了更多细节。他们明确表示,计划在未来四年内投资5000亿美元,在美国为OpenAI构建一个全新的AI基础设施。这让我颇感意外,尤其是考虑到埃隆…

A Critique of ANSI SQL Isolation Levels.18695069

原文:A critique of ANSI SQL isolation levels摘要:ANSI SQL-92[MS, ANSI]使用脏读、不可重复读以及幻读现象(phenomena)定义了隔离级别,本论文展示了这些现象,以及ANSI SQL定义并无法合适的描述众多流行的隔离级别,包括(ANSI标准)所涵盖的级别的标准锁实现。我们还介…

HTML, CSS

什么是 HTML、CSS HTML (HyperText Markup Language): 超文本标记语言. 超文本: 超越了普通文本的限制, 比普通文本更加强大. 除了文字信息, 还可以定义图片、音频、视频等内容. 标记语言: 由标签构成的语言. HTML 标签都是预定义好的。例如: 使用 <a> 展示超链接,使用 &…

Cisco NX-OS System Software - ACI 16.1(2f) - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件

Cisco NX-OS System Software - ACI 16.1(2f) - 适用于 ACI 模式下的 Nexus 9000 系列交换机系统软件Cisco NX-OS System Software - ACI 16.1(2f) 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件 请访问原文链接:https://sysin.org/blog/cisco-aci-16/ 查看最新版…

Cisco APIC 6.1(2f)F - 应用策略基础设施控制器

Cisco APIC 6.1(2f)F - 应用策略基础设施控制器Cisco APIC 6.1(2f)F - 应用策略基础设施控制器 Application Policy Infrastructure Controller (APIC) 请访问原文链接:https://sysin.org/blog/cisco-apic-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思科…

[搬运自 qq 空间] 19 北大冬令营小结

PKU 冬令营19北大冬令营小结 北大冬令营刚刚结束 , 以下是这两天以来笔者的经历。 Day1 比赛日 上午开营仪式 , 整个过程大概就是讲了一下北大计算机学科有哪些优势 , 比较无趣。 12 : 40的时候来到机房准备考试 , 1 : 00钟时 , 比赛正式开始。 首先浏览了一下A题 , 是吉…

X3ctf 比赛 Write Up

X3ctf Write Up 1. Misc p11n-trophy(签到题): 题目描述:我们首先会得到这样一份证书:第一题签到题的答案就是证书下面正中间的“This certificate does not grant the rank of Master"。 trophy-plus + trophy-plus64: 这两道目描述一模一样其中一个flag是藏在certif…