原始代碼使用已移除的 mysql_* 函數(PHP 7.0+ 不支援),且無預處理、錯誤處理簡陋。
<?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]);
?>
mysql_ 替換為 PDO 封裝。