在 MVC 架構中,Model 層負責所有資料庫操作。為了統一管理、降低耦合、便於維護與擴展(如未來更換資料庫引擎),必須建立一個專責的資料庫操作管理類——全系統唯一的直接操作資料庫入口。其他類別若需存取資料,必須透過此類代理。
以下是一個針對 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);
}
}
?>
$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>';
}
$db = new Db();
$result = $db->execute("INSERT INTO articles (title, content) VALUES ('標題', '內容')");
if ($result > 0) echo '新增成功';
else echo '新增失敗';
Db 類直接操作資料庫,確保存取路徑可控。此抽象層為後續 Model 層開發奠定了堅實基礎,也是 MVC 架構落地的關鍵一步。