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的 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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异