myAdBanner

2026年5月12日 星期二

通用資料庫類別 Database.php

 我們將 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() 方法來處理各種情況:

A. 讀取 (Read)
php
$db = new Database();

// 讀取多筆
$users = $db->run("SELECT * FROM users WHERE status = ?", [1])->fetchAll();
foreach ($users as $user) {
    echo $user['name'];
}

// 讀取單筆
$user = $db->run("SELECT * FROM users WHERE id = ?", [1])->fetch();
B. 新增 (Create)
php
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$db->run($sql, ['張小明', 'ming@example.com']);
echo "新增成功,ID 為:" . $db->getConnection()->lastInsertId();
C. 更新 (Update)
php
$sql = "UPDATE users SET name = ? WHERE id = ?";
$db->run($sql, ['新名字', 1]);
D. 刪除 (Delete)
php
$sql = "DELETE FROM users WHERE id = ?";
$db->run($sql, [1]);

為什麼這樣寫比較好?
防止 SQL 注入:透過 ? 佔位符與 run() 的第二個參數(陣列)傳值,PDO 會自動過濾惡意代碼。
程式碼簡潔:你不需要每次都寫 prepare、bind、execute,一行 run() 搞定。
單例模式 (Singleton) 概念:getConnection() 內做了判斷,確保同一個請求中只會開啟一個資料庫連線,節省效能。