雖然現代框架多採用 PDO 或 ORM,但大量存量專案仍仰賴 mysql_* 函數。本文整理一個結構清晰、功能完備的 db 類,涵蓋連線管理、預處理模擬、錯誤日誌、結果集處理與常用 CRUD 封裝,助你快速升級舊代碼庫的可維護性。
pconnect) 與普通連線切換。SET NAMES,杜絕亂碼。halt() 將錯誤寫入 db_error 表,並可選擇性輸出 HTML 錯誤頁。| 方法 | 用途 |
|---|---|
connect($config) | 建立連線,支援 charset 參數 |
query($sql) / query_unbuffered() | 執行 SQL,返回資源 ID,自動計數與記錄 |
fetch_array($res) | 取得關聯陣列 |
affected_rows() / num_rows() | 影響行數 / 查詢行數 |
insert_id() | 取得最後自增 ID |
free_result() / close_db() | 釋放結果集 / 關閉連線 |
row_insert/update/delete/select() | 高階 CRUD 封裝,自動拼裝 SQL |
sql_select/insert/update/delete() | SQL 字串產生器,便於複雜查詢自定義 |
<?php
$db_config = [
'hostname' => '127.0.0.1',
'username' => 'root',
'password' => 'secret',
'database' => 'my_app',
'charset' => 'utf8'
];
require_once 'db.class.php';
$db = new db();
$db->connect($db_config);
// 查詢 cid=1 的所有文章
$rows = $db->row_select('articles', 'cid=1', 20, '*', 'id', 'DESC');
foreach ($rows as $row) {
echo $row['title'] . "<br>";
}
// 新增資料
$db->row_insert('logs', ['msg' => 'User login', 'uid' => 1001]);
// 更新
$db->row_update('users', ['last_login' => date('Y-m-d H:i:s')], 'id=1001');
?>
db 類介面不變,內部實現逐步替換為 PDO。prepare() / execute() 方法,新代碼優先使用參數綁定防注入。PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION 統一異常處理。mysql_* 相容層,專案平滑過渡。這個 db 類雖基於已棄用的 mysql 擴展,但其設計模式(單一職責、資源封裝、錯誤集中處理)值得借鑑。對於無法立即重構的舊系統,它是穩健的過渡橋樑;對於新專案,請直接擁抱 PDO 或成熟 ORM。