項目中頻繁操作 MySQL,原生 mysqli/PDO 代碼分散難維護。本文展示一個基於**單例模式**的輕量 MySQL 封裝類,涵蓋連接池化、字符集設置、查詢/獲取單行/獲取單值/影響行數/最後插入 ID、自動生成 INSERT/UPDATE SQL 等高頻功能。
class mysql extends absdb {
// 單例屬性
protected static $ins = null;
// 連接參數
protected $host, $user, $passwd, $db, $port;
protected $conn = null;
// 核心方法:getIns, connect, query, getAll, getRow, getOne, affected_rows, last_id, autoExecute
}
getIns()public static function getIns() {
if (self::$ins === null) self::$ins = new self();
$conf = conf::getIns(); // 假設有配置單例
self::$ins->host = $conf->host;
self::$ins->user = $conf->user;
self::$ins->passwd = $conf->pwd;
self::$ins->db = $conf->db;
self::$ins->port = $conf->port;
self::$ins->connect();
self::$ins->select_db();
self::$ins->setChar();
return self::$ins;
}
| 方法 | 用途 | 返回值 |
|---|---|---|
query($sql) | 執行任意 SQL | resource / false |
getAll($sql) | 查詢所有行 | array / false |
getRow($sql) | 查詢單行 | array / false |
getOne($sql) | 查詢單值(第一列) | mixed / false |
affected_rows() | 影響行數 | int |
last_id() | 最後自增 ID | int |
autoExecute($data, $table, $act, $where) | 自動構建 INSERT/UPDATE | resource / false |
autoExecute() 詳解// INSERT
$data = ['username'=>'tom', 'email'=>'tom@example.com'];
$db->autoExecute($data, 'users', 'insert');
// → INSERT INTO users (username,email) VALUES ('tom','tom@example.com')
// UPDATE
$data = ['email'=>'new@example.com'];
$db->autoExecute($data, 'users', 'update', "id=5");
// → UPDATE users SET email='new@example.com' WHERE id=5
實現邏輯:遍歷 $data 鍵值對構建字段列表與值列表,update 模式需強制傳入 $where 防全表更新。
$db = mysql::getIns();
// 查詢列表
$list = $db->getAll("SELECT * FROM article WHERE status=1 ORDER BY id DESC LIMIT 10");
// 查詢單篇
$row = $db->getRow("SELECT * FROM article WHERE id=100");
// 統計總數
$total = $db->getOne("SELECT COUNT(*) FROM article WHERE status=1");
// 寫入
$db->autoExecute(['title'=>'新文章','content'=>'...'], 'article', 'insert');
echo "新文章 ID: " . $db->last_id();
query() 直拼 SQL,存在注入風險。建議重寫為 prepare() + bind_param()Exception,建議定義專屬異常體系(DbConnectionException, DbQueryException)此類作為早期 PHP 專案的典型封裝參考,理解其設計思想(單例、配置解耦、CRUD 封裝、SQL 構建器雛形)有助於閱讀遺留代碼與設計現代數據庫抽象層。