You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现数据库数据的分页输出(每页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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:41:25