萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

MySQL 資料庫抽象層函數庫(PDO 版現代化重寫)

舊版問題

原始代碼使用已移除的 mysql_* 函數(PHP 7.0+ 不支援),且無預處理、錯誤處理簡陋。

現代化 PDO 封裝類別

<?php
declare(strict_types=1);

class Database {
    private PDO $pdo;

    public function __construct(string $dsn, string $user, string $pass, array $options = []) {
        $defaultOptions = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false, // 使用真實預處理
        ];
        $this->pdo = new PDO($dsn, $user, $pass, $defaultOptions + $options);
    }

    public function query(string $sql, array $params = []): array {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll();
    }

    public function execute(string $sql, array $params = []): int {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt->rowCount();
    }

    public function insert(string $table, array $data): string|int {
        $fields = implode(',', array_keys($data));
        $placeholders = ':' . implode(',:', array_keys($data));
        $sql = "INSERT INTO {$table} ({$fields}) VALUES ({$placeholders})";
        $this->execute($sql, $data);
        return $this->pdo->lastInsertId();
    }

    public function update(string $table, array $data, string $where, array $whereParams = []): int {
        $set = implode(',', array_map(fn($k) => "{$k}=:{$k}", array_keys($data)));
        $sql = "UPDATE {$table} SET {$set} WHERE {$where}";
        return $this->execute($sql, $data + $whereParams);
    }

    public function delete(string $table, string $where, array $params = []): int {
        return $this->execute("DELETE FROM {$table} WHERE {$where}", $params);
    }

    public function beginTransaction(): void { $this->pdo->beginTransaction(); }
    public function commit(): void { $this->pdo->commit(); }
    public function rollBack(): void { $this->pdo->rollBack(); }

    // 取得底層 PDO 實例以進行高級操作
    public function getPdo(): PDO { return $this->pdo; }
}

// 使用範例
$db = new Database('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$users = $db->query('SELECT * FROM users WHERE status = ?', [1]);
$db->insert('logs', ['msg' => '登入', 'uid' => 1001]);
?>

關鍵改進點

  • ✅ 參數化查詢防 SQL 注入
  • ✅ 例外處理統一錯誤流程
  • ✅ 支援交易
  • ✅ 型別宣告、嚴格模式
  • ✅ 可擴充:分頁、關聯查詢、Schema Builder

遷移建議

  1. 全專案搜尋 mysql_ 替換為 PDO 封裝。
  2. 資料庫設定集中管理(.env + config/database.php)。
  3. 引入遷移工具管理 Schema 版本。
copyright © 萬盛學電腦網 all rights reserved