首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 單例模式封裝 MySQL 操作類:連接管理、預處理、CRUD 封裝與自動 SQL 生成

     編輯:PHP 綜合知識

項目中頻繁操作 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)執行任意 SQLresource / false
getAll($sql)查詢所有行array / false
getRow($sql)查詢單行array / false
getOne($sql)查詢單值(第一列)mixed / false
affected_rows()影響行數int
last_id()最後自增 IDint
autoExecute($data, $table, $act, $where)自動構建 INSERT/UPDATEresource / false

自動 SQL 生成 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();

遺留問題與現代化建議

  • 基於 mysql_* 函數:PHP 7.0+ 已移除,生產環境**必須遷移至 mysqli 或 PDO**
  • 無預處理支援:當前 query() 直拼 SQL,存在注入風險。建議重寫為 prepare() + bind_param()
  • 異常處理:僅拋出 Exception,建議定義專屬異常體系(DbConnectionException, DbQueryException)
  • 連接復用:長運行腳本(Worker、CLI)需加入心跳檢測與重連邏輯

此類作為早期 PHP 專案的典型封裝參考,理解其設計思想(單例、配置解耦、CRUD 封裝、SQL 構建器雛形)有助於閱讀遺留代碼與設計現代數據庫抽象層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved