封裝通用數據庫類,根據配置動態構建 PDO DSN 字符串,支持 MySQL, MSSQL, Oracle, SQLite, PostgreSQL, Firebird, ODBC 等多種數據庫。
<?php
class Database {
private $hostname, $database, $username, $password, $hostport, $datatype;
public function __construct($config) {
$this->hostname = $config['host'] ?? 'localhost';
$this->database = $config['dbname'] ?? '';
$this->username = $config['user'] ?? '';
$this->password = $config['pass'] ?? '';
$this->hostport = $config['port'] ?? '';
$this->datatype = $config['type'] ?? 'MYSQL';
}
private function setDSN() {
switch (strtoupper($this->datatype)) {
case 'MYSQL':
$_DSN = "mysql:host={$this->hostname};dbname={$this->database}";
if ($this->hostport) $_DSN .= ";port={$this->hostport}";
break;
case 'MSSQL':
case 'DB2':
$_DSN = "dblib:host={$this->hostname}:{$this->hostport};dbname={$this->database}";
break;
case 'ORACLE':
// 方式一:TNS 字符串(推薦用於無 tnsnames.ora 環境)
$_tns = "
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = {$this->hostname})(PORT = {$this->hostport}))
)
(CONNECT_DATA =
(SERVICE_NAME = {$this->database})
)
)";
$_DSN = 'oci:dbname=' . $_tns;
break;
case 'SQLITE':
// SQLite 使用文件路徑,非主機名
$_DSN = 'sqlite:' . $this->hostname; // $this->hostname 實為文件路徑
break;
case 'PGSQL':
$_DSN = "pgsql:host={$this->hostname};port={$this->hostport};dbname={$this->database}";
break;
case 'FIREBIRD':
$_DSN = "firebird:dbname={$this->hostname}:{$this->database}";
break;
case 'ODBC':
$_DSN = "odbc:DSN={$this->hostname};UID={$this->username};PWD={$this->password}";
break;
default:
throw new Exception("Unsupported database type: {$this->datatype}");
}
return $_DSN;
}
public function connect() {
try {
$dsn = $this->setDSN();
$pdo = new PDO($dsn, $this->username, $this->password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch (PDOException $e) {
throw new Exception("Connection failed: " . $e->getMessage());
}
}
}
// 使用示例
$mysql = new Database([
'type' => 'MYSQL',
'host' => 'localhost',
'dbname' => 'myapp',
'user' => 'root',
'pass' => 'secret',
'port' => '3306'
]);
$pdo = $mysql->connect();
?>
sqlite:/path/to/db.sqlitesqlite::memory:sqlite2:/path/to/db.sqliteLD_LIBRARY_PATH;Windows: 設置 PATH 包含 client/libTNS_ADMIN 指向 tnsnames.ora 目錄oci:dbname=yoursid(需 tnsnames.ora 配置)database_file 避免混淆charset 參數(MySQL: charset=utf8mb4)考慮使用成熟庫如 Doctrine DBAL 或 Laravel Database 組件,已完善處理各類數據庫 DSN 差異、連接池、語法平台差異等。