我們將 Database 類別擴充,加入一個通用的 run() 方法來處理所有 SQL 執行。
<?php
class Database {
private $host = "localhost";
private $db_name = "your_db";
private $username = "root";
private $password = "";
private $conn;
public function getConnection() {
if ($this->conn === null) {
try {
$this->conn = new PDO(
"mysql:host=$this->host;dbname=$this->db_name;charset=utf8mb4",
$this->username,
$this->password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
} catch(PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
}
return $this->conn;
}
// 通用的執行方法
public function run($sql, $args = []) {
$stmt = $this->getConnection()->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
你可以直接使用 run() 方法來處理各種情況:
為什麼這樣寫比較好?
防止 SQL 注入:透過 ? 佔位符與 run() 的第二個參數(陣列)傳值,PDO 會自動過濾惡意代碼。
程式碼簡潔:你不需要每次都寫 prepare、bind、execute,一行 run() 搞定。
單例模式 (Singleton) 概念:getConnection() 內做了判斷,確保同一個請求中只會開啟一個資料庫連線,節省效能。