如何实现数据库数据的分页输出(每页20条自动生成分页)
PHP实现数据库全量数据分页(类似谷歌搜索分页样式)
嘿,刚接触Stack Overflow完全没问题~我帮你把分页功能的PHP代码优化并补全,实现每页20条数据,还有像谷歌那样的智能分页导航(比如显示当前页前后几页、首尾页按钮,超出范围用省略号代替)。
1. 完整优化后的代码示例
这里是整理好的代码,注释很清晰,直接替换你的数据库信息就能用:
<?php // 数据库配置(根据你的实际情况修改) $host = 'localhost'; $dbname = 'your_database'; $username = 'your_username'; $password = 'your_password'; try { // 用PDO连接数据库(比老旧的mysql_*函数更安全,支持预处理防注入) $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 分页参数处理 $perPage = 20; // 每页固定20条数据 $currentPage = isset($_GET['page']) ? (int)$_GET['page'] : 1; $currentPage = max($currentPage, 1); // 确保页码不会小于1 // 获取总数据条数,计算总页数 $totalStmt = $pdo->query("SELECT COUNT(*) FROM your_table"); $totalItems = $totalStmt->fetchColumn(); $totalPages = ceil($totalItems / $perPage); $currentPage = min($currentPage, $totalPages); // 确保页码不会超过总页数 // 计算SQL查询的偏移量 $offset = ($currentPage - 1) * $perPage; // 查询当前页的数据(用预处理语句,避免SQL注入) $dataStmt = $pdo->prepare("SELECT * FROM your_table LIMIT :offset, :perPage"); $dataStmt->bindParam(':offset', $offset, PDO::PARAM_INT); $dataStmt->bindParam(':perPage', $perPage, PDO::PARAM_INT); $dataStmt->execute(); $items = $dataStmt->fetchAll(PDO::FETCH_ASSOC); } catch(PDOException $e) { die("数据库操作出错啦: " . $e->getMessage()); } ?> <!-- HTML部分:展示数据和分页导航 --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>数据分页展示</title> <style> /* 简单美化分页样式,贴近谷歌风格 */ .pagination { margin: 25px 0; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; } .pagination a, .pagination span { padding: 8px 14px; text-decoration: none; border: 1px solid #e0e0e0; border-radius: 4px; color: #3c4043; font-size: 14px; } .pagination a:hover { border-color: #dadce0; background-color: #f8f9fa; } .pagination .current { background-color: #1967d2; color: white; border-color: #1967d2; } .pagination .disabled { color: #dadce0; border-color: #e8eaed; pointer-events: none; cursor: default; } .data-container ul { list-style: none; padding-left: 0; } .data-container li { padding: 10px; border-bottom: 1px solid #eee; } </style> </head> <body> <!-- 数据展示区域 --> <div class="data-container"> <?php if(!empty($items)): ?> <ul> <?php foreach($items as $item): ?> <!-- 替换成你实际要展示的字段,比如$item['id']、$item['title']等 --> <li>ID: <?php echo htmlspecialchars($item['id']); ?> - 内容: <?php echo htmlspecialchars($item['content']); ?></li> <?php endforeach; ?> </ul> <?php else: ?> <p>暂时没有数据哦~</p> <?php endif; ?> </div> <!-- 分页导航区域 --> <div class="pagination"> <!-- 首页按钮 --> <a href="?page=1" <?php echo ($currentPage == 1) ? 'class="disabled"' : ''; ?>>首页</a> <!-- 上一页按钮 --> <a href="?page=<?php echo $currentPage - 1; ?>" <?php echo ($currentPage == 1) ? 'class="disabled"' : ''; ?>>上一页</a> <!-- 智能页码列表:显示当前页前后2页,超出范围显示省略号 --> <?php $startPage = max(1, $currentPage - 2); $endPage = min($totalPages, $currentPage + 2); // 如果起始页大于1,显示省略号 if($startPage > 1) { echo '<span>...</span>'; } for($i = $startPage; $i <= $endPage; $i++) { if($i == $currentPage) { echo '<span class="current">' . $i . '</span>'; } else { echo '<a href="?page=' . $i . '">' . $i . '</a>'; } } // 如果结束页小于总页数,显示省略号 if($endPage < $totalPages) { echo '<span>...</span>'; } ?> <!-- 下一页按钮 --> <a href="?page=<?php echo $currentPage + 1; ?>" <?php echo ($currentPage == $totalPages) ? 'class="disabled"' : ''; ?>>下一页</a> <!-- 尾页按钮 --> <a href="?page=<?php echo $totalPages; ?>" <?php echo ($currentPage == $totalPages) ? 'class="disabled"' : ''; ?>>尾页</a> <!-- 页码信息提示 --> <span>第 <?php echo $currentPage; ?> 页 / 共 <?php echo $totalPages; ?> 页</span> </div> </body> </html>
2. 代码优化点说明
- 替换了不安全的
mysql_*函数,改用PDO连接数据库,支持预处理语句,从根源避免SQL注入风险 - 增加了页码边界校验,防止用户手动输入非法页码(比如0或超过总页数的数字)
- 分页导航逻辑和谷歌搜索一致:只显示当前页前后2页,超出范围时用省略号,同时保留首页、尾页、上/下一页按钮,不会出现页码过多挤在一起的情况
- 加入了基础的CSS样式,让页面看起来更整洁,分页按钮的交互也更友好
- 用
htmlspecialchars()转义输出的内容,防止XSS攻击,提升页面安全性
3. 使用时需要调整的地方
- 把数据库配置里的
$host、$dbname、$username、$password改成你自己的数据库信息 - 替换
your_table为你要查询的数据库表名 - 把数据展示部分的
$item['id']、$item['content']改成你表中实际的字段名 - 如果需要调整每页展示的条数,修改
$perPage的值即可
内容的提问来源于stack exchange,提问作者Oliver.Kirkpatrick
相关产品推荐
相关产品推荐

