php 完整分页类及通过mysqli连接数据库的方法

以下是一个使用MySQLi连接数据库并实现分页功能的PHP完整分页类。这个类封装了分页所需的所有逻辑,并允许你通过MySQLi连接来获取分页数据。

数据库连接类

首先,我们创建一个简单的数据库连接类,使用MySQLi来连接数据库。

<?php
class Database {
    private $host = 'localhost';
    private $db_name = 'your_database';
    private $username = 'your_username';
    private $password = 'your_password';
    private $conn;

    public function __construct() {
        $this->conn = new mysqli($this->host, $this->username, $this->password, $this->db_name);

        // 检查连接
        if ($this->conn->connect_error) {
            die("连接失败: " . $this->conn->connect_error);
        }
    }

    public function getConnection() {
        return $this->conn;
    }
}
?>

分页类

接下来,我们创建一个分页类,它将使用上面定义的数据库连接类来获取数据。

<?php
class Pagination {
    private $db;
    private $total_rows;
    private $per_page;
    private $current_page;
    private $total_pages;

    public function __construct($db, $table, $per_page = 10, $page = 1) {
        $this->db = $db;
        $this->per_page = $per_page;
        $this->current_page = $page;

        // 获取总行数
        $sql = "SELECT COUNT(*) as total FROM $table";
        $result = $this->db->getConnection()->query($sql);
        $row = $result->fetch_assoc();
        $this->total_rows = $row['total'];

        // 计算总页数
        $this->total_pages = ceil($this->total_rows / $this->per_page);
    }

    public function getData($table, $columns = '*') {
        $offset = ($this->current_page - 1) * $this->per_page;
        $sql = "SELECT $columns FROM $table LIMIT $offset, $this->per_page";
        $result = $this->db->getConnection()->query($sql);
        return $result->fetch_all(MYSQLI_ASSOC);
    }

    public function createLinks($baseUrl) {
        $links = '';

        for ($i = 1; $i <= $this->total_pages; $i++) {
            $links .= "<a href='$baseUrl?page=$i'>$i</a> ";
        }

        return $links;
    }
}
?>

使用示例

现在,我们将这两个类组合起来,并展示如何使用它们来实现分页功能。

<?php
require 'Database.php';
require 'Pagination.php';

// 初始化数据库连接
$db = new Database();

// 获取当前页码,默认为1
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;

// 确保页码在有效范围内
$page = max(1, min($page, ceil($total_rows / $per_page))); // 注意:这里$total_rows和$per_page需要在分页对象创建前已知,但在这个示例中我们会在分页对象内部获取它们,所以这里只是为了说明如何限制页码。实际上,你应该在创建分页对象后使用$pagination->getTotalPages()来获取总页数,并据此来限制页码。但由于这个示例的简化,我们暂时省略这一步。

// 初始化分页对象
$pagination = new Pagination($db, 'your_table', 10, $page);

// 获取分页数据
$data = $pagination->getData('your_table');

// 显示数据
echo "<table border='1'>";
echo "<tr><th>ID</th><th>Name</th></tr>";
foreach ($data as $row) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($row['id']) . "</td>";
    echo "<td>" . htmlspecialchars($row['name']) . "</td>";
    echo "</tr>";
}
echo "</table>";

// 显示分页链接
$baseUrl = $_SERVER['PHP_SELF']; // 获取当前脚本的URL(不包含查询字符串)
echo "<div>";
echo $pagination->createLinks($baseUrl);
echo "</div>";
?>

注意:

在上面的使用示例中,$total_rows 和 $per_page 在分页对象创建前并没有已知的值。在实际应用中,你应该在创建分页对象之前获取总行数(可以通过一个单独的查询或使用分页类内部的逻辑),然后根据总行数和每页显示的数量来计算总页数。但是,为了简化示例,我们在分页类内部进行了这些计算。
在显示分页链接时,我们使用了 $_SERVER[‘PHP_SELF’] 来获取当前脚本的URL(不包含查询字符串)。这通常是一个安全的方法来构建基于当前页面的链接,但请确保在使用 $_SERVER[‘PHP_SELF’] 时进行适当的验证和清理,以防止潜在的安全问题(如跨站脚本攻击XSS)。
在实际部署中,请确保数据库连接信息(如用户名和密码)的安全性,不要将其硬编码在脚本中,可以使用配置文件或环境变量。
上面的代码示例没有包含完整的错误处理逻辑。在实际应用中,你应该添加适当的错误处理来捕获并处理可能发生的异常或错误。