PHP项目如何实现分页功能?

wen PHP项目 12

本文目录导读:

PHP项目如何实现分页功能?

  1. 分页基本原理
  2. 完整代码实现
  3. 优化版本:封装为函数
  4. 样式美化 (CSS)
  5. 注意事项

在PHP项目中实现分页功能通常涉及以下核心步骤,这里给出一个完整且清晰的实现方案:

分页基本原理

分页需要知道3个关键数据:

  • 当前页码 ($page)
  • 每页显示条数 ($pageSize)
  • 数据总条数 ($total)

通过这些可以计算出:

  • 总页数:ceil($total / $pageSize)
  • 起始偏移量:($page - 1) * $pageSize

完整代码实现

SQL查询部分

<?php
// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
// 获取当前页码,默认为第1页
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$page = max(1, $page); // 确保页码不小于1
// 每页显示10条
$pageSize = 10;
// 计算总记录数
$countSql = "SELECT COUNT(*) FROM articles";
$total = $pdo->query($countSql)->fetchColumn();
// 计算总页数
$totalPages = ceil($total / $pageSize);
// 确保当前页不超过总页数
$page = min($page, $totalPages);
// 计算偏移量
$offset = ($page - 1) * $pageSize;
// 查询当前页数据
$sql = "SELECT * FROM articles ORDER BY id DESC LIMIT $offset, $pageSize";
$stmt = $pdo->query($sql);
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

显示数据

<table border="1">
    <tr>
        <th>ID</th>
        <th>标题</th>
        <th>内容</th>
    </tr>
    <?php foreach ($articles as $article): ?>
    <tr>
        <td><?= $article['id'] ?></td>
        <td><?= htmlspecialchars($article['title']) ?></td>
        <td><?= htmlspecialchars($article['content']) ?></td>
    </tr>
    <?php endforeach; ?>
</table>

分页导航

<div class="pagination">
    <?php if ($page > 1): ?>
        <a href="?page=1">首页</a>
        <a href="?page=<?= $page - 1 ?>">上一页</a>
    <?php endif; ?>
    <?php for ($i = 1; $i <= $totalPages; $i++): ?>
        <?php if ($i == $page): ?>
            <span class="current"><?= $i ?></span>
        <?php else: ?>
            <a href="?page=<?= $i ?>"><?= $i ?></a>
        <?php endif; ?>
    <?php endfor; ?>
    <?php if ($page < $totalPages): ?>
        <a href="?page=<?= $page + 1 ?>">下一页</a>
        <a href="?page=<?= $totalPages ?>">末页</a>
    <?php endif; ?>
</div>

优化版本:封装为函数

<?php
/**
 * 分页函数 (MySQL/PDO 版本)
 * @param PDO $pdo 数据库对象
 * @param string $table 表名
 * @param int $pageSize 每页条数
 * @param string $where WHERE条件
 * @param string $order 排序
 * @return array ['data'=>数据, 'page'=>当前页, 'totalPages'=>总页数, 'total'=>总条数]
 */
function paginate($pdo, $table, $pageSize = 10, $where = '1=1', $order = 'id DESC') {
    $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
    $page = max(1, $page);
    // 获取总数
    $countSql = "SELECT COUNT(*) FROM $table WHERE $where";
    $total = $pdo->query($countSql)->fetchColumn();
    $totalPages = ceil($total / $pageSize);
    // 限制页码
    if ($totalPages == 0) $totalPages = 1;
    $page = min($page, $totalPages);
    // 查询数据
    $offset = ($page - 1) * $pageSize;
    $sql = "SELECT * FROM $table WHERE $where ORDER BY $order LIMIT $offset, $pageSize";
    $data = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    return [
        'data' => $data,
        'page' => $page,
        'totalPages' => $totalPages,
        'total' => $total
    ];
}
// 使用示例
$result = paginate($pdo, 'articles', 10);
$articles = $result['data'];
$page = $result['page'];
$totalPages = $result['totalPages'];
$total = $result['total'];
?>

样式美化 (CSS)

.pagination {
    margin: 20px 0;
    text-align: center;
}
.pagination a, .pagination span {
    display: inline-block;
    padding: 6px 12px;
    margin: 0 4px;
    border: 1px solid #ddd;
    color: #337ab7;
    text-decoration: none;
    border-radius: 3px;
}
.pagination a:hover {
    background-color: #eee;
}
.pagination .current {
    background-color: #337ab7;
    color: white;
    border-color: #337ab7;
}

注意事项

  1. SQL注入防护:LIMIT参数使用intval()确保是整数
  2. 大数据量优化:超过百万数据建议使用SELECT COUNT(*)的缓存或近似算法
  3. URL参数处理:如果URL有其他参数,需要保留
  4. SEO友好:可考虑使用URL重写实现 /page/2 的形式
  5. AJAX分页:前端可通过API接口实现异步分页

这样实现的分页功能既简单又完整,可以适应大多数PHP项目的需求。

抱歉,评论功能暂时关闭!