在早期 PHP 專案中,將重複的 MySQL 連線、查詢、錯誤處理邏輯封裝成類別,是提升開發效率與程式碼可維護性的常見做法。本文提供一個經典的 DB 類別範例,展示構造函數自動連線、查詢執行、筆數統計、錯誤攔截與析構釋放資源的完整流程。
<?php
class DB
{
// 資料庫連線參數
var $host_addr = "localhost";
var $host_user = "root";
var $host_psw = "123";
var $db_name = "test";
// 內部資源屬性
var $link_id; // 連線識別資源
var $query_id; // 查詢結果資源
var $numRow; // 影響/回傳筆數
// 建構子:自動連線並選擇資料庫
function DB()
{
$this->link_id = @mysql_connect($this->host_addr, $this->host_user, $this->host_psw);
if ($this->link_id) {
@mysql_select_db($this->db_name, $this->link_id)
or $this->halt("資料庫選擇失敗!");
} else {
$this->halt("連接伺服器失敗!");
return false;
}
return $this->link_id;
}
// 執行 SQL 查詢
function query($sql)
{
$this->query_id = @mysql_query($sql, $this->link_id);
if ($this->query_id) {
return $this->query_id;
} else {
$this->halt("SQL Error: " . mysql_error());
return false;
}
}
// 取得查詢結果筆數
function numRow()
{
return $this->numRow = @mysql_num_rows($this->query_id);
}
// 關閉資料庫連線
function close()
{
return @mysql_close($this->link_id);
}
// 統一錯誤處理
function halt($msg)
{
echo "<font color=\"#FF0000\">" . $msg . "</font>";
}
}
?>
<?php
require_once 'DB.class.php';
$db = new DB(); // 自動連線
// 查詢範例
$sql = "SELECT * FROM users WHERE status = 1";
$result = $db->query($sql);
if ($result) {
echo "共找到 {$db->numRow()} 筆資料<br>";
while ($row = mysql_fetch_assoc($result)) {
echo "ID: {$row['id']}, Name: {$row['name']}<br>";
}
}
// 寫入範例
$insertSql = "INSERT INTO logs (msg, created_at) VALUES ('測試訊息', NOW())";
$db->query($insertSql);
$db->close(); // 釋放連線
?>
@: 配合自訂 halt() 方法,統一錯誤輸出格式,避免預設錯誤訊息洩露敏感資訊。$link_id 與查詢結果 $query_id 皆為私有屬性,外部僅透過方法操作。fetchRow()、fetchAll()、affectedRows()、lastInsertId() 等常用方法。本類別基於已棄用的
mysql_*擴展 (PHP 5.5 棄用,PHP 7.0 移除)。 新專案務必使用 PDO (PHP Data Objects) 或 MySQLi,支援預處理語句、交易控制、多資料庫驅動等現代特性,有效防止 SQL 注入攻擊。
<?php
class DB_PDO
{
private $pdo;
public function __construct($dsn, $user, $pass)
{
$this->pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
}
public function query($sql, $params = [])
{
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
}
public function fetchAll($sql, $params = [])
{
return $this->query($sql, $params)->fetchAll();
}
}
// 使用
$db = new DB_PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '123');
$users = $db->fetchAll("SELECT * FROM users WHERE status = ?", [1]);
?>