首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

PHP MVC 實戰(二):構建資料庫抽象操作管理類

     編輯:VC 教學

為什麼需要資料庫抽象層?

在 MVC 架構中,Model 層負責所有資料庫操作。為了統一管理、降低耦合、便於維護與擴展(如未來更換資料庫引擎),必須建立一個專責的資料庫操作管理類——全系統唯一的直接操作資料庫入口。其他類別若需存取資料,必須透過此類代理。

Db 類核心設計

以下是一個針對 MySQL 設計的 Db 類骨架,支援序列獲取、分頁查詢、資料寫入等常用操作:

<?php
/**************************************************************
 * 描述:MySQL 資料庫操作管理類
 * 作者:大齡青年
 **************************************************************/

// 定義資料庫連線參數
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PWD', '');
define('DB_PCONNECT', true);  // 是否使用持久連線

// 定義結果集獲取模式常數
define('DB_FETCH_ASSOC', 1);  // 關聯陣列 $row['name']
define('DB_FETCH_NUM', 2);    // 數值索引 $row[0]

class Db {
    private $link;            // 資料庫連線資源
    private $queryId;         // 最近一次查詢資源
    private $fetchMode;       // 當前獲取模式

    // 建構子:自動建立連線
    public function __construct() {
        $this->connect();
    }

    // 建立資料庫連線
    private function connect() {
        $func = DB_PCONNECT ? 'mysql_pconnect' : 'mysql_connect';
        $this->link = $func(DB_HOST, DB_USER, DB_PWD);
        if (!$this->link) {
            die('資料庫連線失敗: ' . mysql_error());
        }
        mysql_select_db(DB_NAME, $this->link);
        mysql_query("SET NAMES 'utf8'", $this->link);
    }

    // 通用查詢執行
    public function query($sql) {
        $this->queryId = mysql_query($sql, $this->link);
        if (!$this->queryId) {
            trigger_error('SQL 錯誤: ' . mysql_error($this->link) . " [SQL: $sql]");
            return false;
        }
        return $this->queryId;
    }

    // 取得單筆記錄
    public function fetchRow($result = null, $mode = DB_FETCH_ASSOC) {
        $res = $result ?: $this->queryId;
        $func = ($mode == DB_FETCH_ASSOC) ? 'mysql_fetch_assoc' : 'mysql_fetch_row';
        return $func($res);
    }

    // 取得所有記錄
    public function fetchAll($sql, $mode = DB_FETCH_ASSOC) {
        $this->query($sql);
        $rows = [];
        while ($row = $this->fetchRow(null, $mode)) {
            $rows[] = $row;
        }
        return $rows;
    }

    // 分頁查詢
    public function queryPage($sql, $page, $pageSize, $mode = DB_FETCH_ASSOC) {
        $offset = ($page - 1) * $pageSize;
        $sql .= " LIMIT $offset, $pageSize";
        return $this->fetchAll($sql, $mode);
    }

    // 寫入操作(INSERT/UPDATE/DELETE)
    public function execute($sql) {
        $this->query($sql);
        return mysql_affected_rows($this->link);
    }

    // 獲取自增 ID
    public function getInsertId() {
        return mysql_insert_id($this->link);
    }

    // 獲取序列(模擬 Oracle 序列)
    public function getSeq($seqName, $step = 1, $start = 1) {
        // 實作邏輯:建立序列表、原子性更新並返回值
        // 此處略去具體實作,概念同上
    }

    // 解構子:關閉連線
    public function __destruct() {
        if ($this->link) mysql_close($this->link);
    }
}
?>

使用範例

範例 1:分頁查詢

$db = new Db();
$result = $db->queryPage('SELECT id, name FROM articles', 2, 10, DB_FETCH_ASSOC);
foreach ($result as $row) {
    echo $row['id'] . '------' . $row['name'] . '<br>';
}

範例 2:插入資料

$db = new Db();
$result = $db->execute("INSERT INTO articles (title, content) VALUES ('標題', '內容')");
if ($result > 0) echo '新增成功';
else echo '新增失敗';

設計要點總結

  • 單一入口:全系統只有 Db 類直接操作資料庫,確保存取路徑可控。
  • 配置外部化:連線參數以常數定義,便於部署環境切換。
  • 錯誤處理:統一錯誤報告機制,避免敏感資訊外洩。
  • 資源管理:建構子/解構子自動管理連線生命週期,防止洩漏。
  • 擴充性:未來若要支援 PostgreSQL、SQLite,只需實作相同介面的新類別即可。

此抽象層為後續 Model 層開發奠定了堅實基礎,也是 MVC 架構落地的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved