在 PHP 開發中,資料庫操作是核心基礎功能。雖然現代框架都內建 ORM 或查詢建構器,但理解如何從零建立一個資料庫操作類,對於掌握底層原理、維護舊專案或輕量級開發仍有重要價值。本文將詳細解析一個功能完整的 PHP 資料庫操作類,涵蓋連線管理、查詢執行、結果獲取、錯誤處理等核心功能。
這個 database 類別採用封裝設計模式,將 MySQL 連線資源與操作方法封裝在一起,提供直觀的介面:
<?php
class database {
private $hostname;
private $user;
private $pass;
private $dbname;
private $linkflag;
private $charset;
function __construct() {
$this->hostname = "localhost";
$this->user = "root";
$this->pass = "111";
$this->dbname = "";
$this->charset = "utf8"; // 支援 gb2312, GBK, utf8
$this->linkflag = mysql_connect($this->hostname, $this->user, $this->pass);
mysql_select_db($this->dbname, $this->linkflag) or die($this->error());
mysql_query("set names " . $this->charset);
}
// ... 魔術方法與核心功能方法
}
?>
透過 __set、__get、__call 實現屬性動態設定與錯誤攔截:
function __set($property_name, $value) {
return $this->$property_name = $value;
}
function __get($property_name) {
if (isset($this->$property_name)) {
return $this->$property_name;
}
return null;
}
function __call($function_name, $args) {
echo "<br><font color=#ff0000>你所調用的方法 $function_name 不存在</font><br>\n";
}
提供多種結果獲取方式,滿足不同場景需求:
function query($sql) {
$res = mysql_query($sql) or die($this->error());
return $res;
}
function fetch_array($res) {
return mysql_fetch_array($res);
}
function fetch_object($res) {
return mysql_fetch_object($res);
}
function fetch_obj_arr($sql) {
$obj_arr = array();
$res = $this->query($sql);
while ($row = mysql_fetch_object($res)) {
$obj_arr[] = $row;
}
return $obj_arr;
}
function error() {
if ($this->linkflag) {
return mysql_error($this->linkflag);
}
return mysql_error();
}
function errno() {
if ($this->linkflag) {
return mysql_errno($this->linkflag);
}
return mysql_errno();
}
function affected_rows() {
return mysql_affected_rows($this->linkflag);
}
注意:原始碼使用已棄用的 mysql_* 函數(PHP 7.0+ 已移除)。現代專案建議:
<?php
$db = new database();
// 動態設定資料庫名稱
$db->dbname = "my_database";
$sql = "SELECT * FROM users WHERE status = 1";
$users = $db->fetch_obj_arr($sql);
foreach ($users as $user) {
echo "用戶: {$user->username} <br>";
}
?>
這個資料庫操作類展示了 PHP 面向對象封裝的經典模式,雖然底層驅動已過時,但其設計思路——連線管理、錯誤處理、多樣化結果獲取——在現代資料庫抽象層中依然適用。理解這些基礎有助於更深入地掌握框架內部運作機制。