PHP Data Objects (PDO) 提供了一個輕量級、一致性的介面來訪問數據庫。本文整理了 PDO 連接 MySQL 的核心知識點,涵蓋 DSN 配置三種寫法、事務處理機制、預處理語句與參數綁定的區別,適合作為快速查閱的參考手冊。
建立 PDO 連接的第一步是定義 DSN,主要有以下三種形式:
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '';
try {
$pdo = new PDO($dsn, $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
將 DSN 字串存放於獨立文件,提升安全性與可維護性。
// config.txt 內容:mysql:host=localhost;dbname=testdb;charset=utf8mb4 $dsn = 'uri:file:///var/www/html/pdo/config.txt'; // Linux 路徑 // Windows 路徑示例:uri:file://C:/xampp/htdocs/pdo/config.txt
; php.ini 中添加 pdo.dsn.mydb = "mysql:host=localhost;dbname=testdb;charset=utf8mb4" // PHP 代碼中直接使用別名 $dsn = 'mydb';
PDO 預設為自動提交模式。透過 beginTransaction() 開啟事務,配合 commit() 提交或 rollBack() 回滾。
<?php
try {
$pdo->beginTransaction();
// 執行多條 SQL 操作
$pdo->exec("INSERT INTO accounts (user, amount) VALUES ('Alice', 100)");
$pdo->exec("UPDATE balances SET total = total - 100 WHERE user = 'Bob'");
// 模擬業務邏輯判斷
if ($someCondition) {
$pdo->commit(); // 提交事務
echo "事務提交成功";
} else {
$pdo->rollBack(); // 回滾事務
echo "事務已回滾";
}
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
注意: MySQL 中 DDL 語句(如
CREATE TABLE、DROP TABLE、ALTER TABLE)會導致隱式提交,無法在事務中回滾。詳細請參考 MySQL 官方文檔。
預處理語句能有效防止 SQL 注入,並提升重複執行的性能。PDO 提供 prepare() 返回 PDOStatement 物件。
<?php $sql = "SELECT * FROM users WHERE email = :email AND status = :status"; $stmt = $pdo->prepare($sql); $stmt->execute([':email' => 'test@example.com', ':status' => 1]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
<?php
$colour = 'red';
$stmt = $pdo->prepare('CALL puree_fruit(?)');
// 參數類型:PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT,長度 12
$stmt->bindParam(1, $colour, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 12);
$stmt->execute();
print("處理後顏色變為: $colour");
<?php
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 使用真實預處理
]);
} catch (PDOException $e) {
// 生產環境建議記錄日誌而非直接輸出
error_log("DB Connection Error: " . $e->getMessage());
die("系統維護中,請稍後再試。");
}
掌握 PDO 的 DSN 配置、事務控制、預處理語句與參數綁定機制,是 PHP 開發者操作 MySQL 的基石。建議在項目中統一封裝數據庫連接類,集中管理錯誤處理、字符集設置與 SQL 日誌記錄。