當前位置: 首頁> 最新文章列表> 將mysqli_result 封裝成通用數據訪問層

將mysqli_result 封裝成通用數據訪問層

M66 2025-05-17

在開發PHP 應用時, mysqli擴展是與MySQL 數據庫進行交互的常用方式。隨著項目的不斷擴展,直接使用mysqli函數可能會導致代碼的重複、耦合性高、難以維護。為了提升代碼復用性和可維護性,我們可以將mysqli_result函數封裝成一個通用的數據訪問層。

本文將介紹如何封裝mysqli_result函數,並提供代碼示例,幫助你構建一個高效、易於維護的數據訪問層。

1. 數據訪問層的設計目標

數據訪問層的設計目的是使得數據庫操作與業務邏輯分離,使得數據庫的訪問邏輯不直接出現在應用的業務代碼中。通過封裝數據庫操作,可以提高代碼的複用性、可維護性,並降低後期更換數據庫的難度。

以下是設計數據訪問層時需要考慮的幾點:

  • 封裝數據庫連接:避免每次操作數據庫時都需要重複編寫連接代碼。

  • 簡化查詢結果處理:將mysqli_result的操作封裝,統一處理查詢結果。

  • 支持CRUD 操作:支持常見的增、刪、改、查操作。

  • 提高代碼復用性:通過封裝,使得數據庫操作代碼復用性更高,減少代碼冗餘。

2. 創建數據庫類

首先,我們需要創建一個數據庫類來管理數據庫的連接和查詢操作。

 class Database {
    private $connection;
    
    // 構造函數初始化數據庫連接
    public function __construct($host, $user, $password, $dbname) {
        $this->connection = new mysqli($host, $user, $password, $dbname);
        
        if ($this->connection->connect_error) {
            die("連接失敗: " . $this->connection->connect_error);
        }
    }

    // 執行查詢,返回結果集
    public function query($sql) {
        $result = $this->connection->query($sql);
        if (!$result) {
            die("查詢失敗: " . $this->connection->error);
        }
        return $result;
    }

    // 關閉數據庫連接
    public function close() {
        $this->connection->close();
    }
}

上述代碼中,我們封裝了一個Database類,該類具有一個構造函數用於初始化數據庫連接,以及一個query方法用於執行SQL 查詢並返回結果集。

3. 封裝mysqli_result結果集

mysqli_resultmysqli中用於存儲查詢結果的一個對象。在我們構建數據訪問層時,通常需要封裝mysqli_result ,使得結果集的操作更加簡潔。

以下是如何封裝mysqli_result的代碼示例:

 class DbResult {
    private $result;

    // 構造函數接收查詢結果
    public function __construct($result) {
        $this->result = $result;
    }

    // 獲取所有結果
    public function fetchAll() {
        $rows = [];
        while ($row = $this->result->fetch_assoc()) {
            $rows[] = $row;
        }
        return $rows;
    }

    // 獲取單行結果
    public function fetchOne() {
        return $this->result->fetch_assoc();
    }

    // 獲取結果的行數
    public function numRows() {
        return $this->result->num_rows;
    }
}

在上述代碼中, DbResult類封裝了mysqli_result對象,並提供了以下方法:

  • fetchAll() :獲取所有查詢結果。

  • fetchOne() :獲取單條查詢結果。

  • numRows() :返回查詢結果的行數。

4. 完整的數據訪問層示例

將數據庫類和結果集封裝類結合,我們可以創建一個功能完整的數據訪問層,如下所示:

 class DataAccessLayer {
    private $db;

    // 構造函數初始化數據庫連接
    public function __construct($host, $user, $password, $dbname) {
        $this->db = new Database($host, $user, $password, $dbname);
    }

    // 查詢數據並返回封裝後的結果集
    public function fetchData($sql) {
        $result = $this->db->query($sql);
        $dbResult = new DbResult($result);
        return $dbResult;
    }

    // 插入數據
    public function insertData($sql) {
        return $this->db->query($sql);
    }

    // 更新數據
    public function updateData($sql) {
        return $this->db->query($sql);
    }

    // 刪除數據
    public function deleteData($sql) {
        return $this->db->query($sql);
    }

    // 關閉連接
    public function close() {
        $this->db->close();
    }
}

在這個例子中, DataAccessLayer類封裝了常見的數據庫操作,如查詢、插入、更新和刪除。我們使用DbResult類來封裝查詢結果,使得結果的操作更加方便。

5. 使用數據訪問層

現在我們可以在業務代碼中使用封裝好的數據訪問層:

 // 創建數據庫訪問對象
$dal = new DataAccessLayer('localhost', 'root', '', 'test_db');

// 查詢數據
$sql = "SELECT * FROM users";
$dbResult = $dal->fetchData($sql);

// 獲取查詢結果
$users = $dbResult->fetchAll();
foreach ($users as $user) {
    echo $user['username'] . "<br>";
}

// 關閉數據庫連接
$dal->close();

這樣,我們就能方便地執行數據庫操作,而不需要在每個頁面中重複編寫連接、查詢結果處理等邏輯。

6. 總結

通過封裝mysqli_result結果集和數據庫連接,我們創建了一個通用的數據訪問層。這個數據訪問層使得數據庫操作更加簡潔、可複用,並且提高了代碼的可維護性。你可以根據自己的業務需求進一步擴展這個數據訪問層,支持更多的數據庫操作,如事務管理、批量插入等。

如果你希望更加靈活的管理數據庫連接,可以引入單例模式來避免多次創建數據庫連接。

希望本篇文章能夠幫助你構建更為高效、可維護的數據庫操作層,提高你的開發效率。