編輯 php.ini 取消註解:
extension=pdo.so extension=pdo_mysql.so ; 對應使用的資料庫 ; extension=pdo_pgsql.so ; extension=pdo_sqlite.so
重啟 PHP-FPM/Apache 後,php -m | grep pdo 應顯示已載入模組。
CREATE TABLE `users` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL DEFAULT '', `email` varchar(100) NOT NULL DEFAULT '', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'db_user';
$pass = 'db_pass';
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 Failed: ' . $e->getMessage());
exit('資料庫連線失敗,請稍後再試');
}
$sql = 'INSERT INTO users (username, email) VALUES (:username, :email)';
$stmt = $pdo->prepare($sql);
$stmt->execute([
':username' => 'john_doe',
':email' => 'john@example.com'
]);
echo '新增成功,ID: ' . $pdo->lastInsertId();
// 單筆
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute([':id' => 1]);
$user = $stmt->fetch(); // 回傳關聯陣列或 false
// 多筆
$stmt = $pdo->prepare('SELECT * FROM users WHERE created_at > :date ORDER BY id DESC');
$stmt->execute([':date' => '2024-01-01']);
$users = $stmt->fetchAll(); // 回傳二維陣列
// 更新
$stmt = $pdo->prepare('UPDATE users SET email = :email WHERE id = :id');
$stmt->execute([':email' => 'new@example.com', ':id' => 1]);
echo "影響行數: {$stmt->rowCount()}";
// 刪除
$stmt = $pdo->prepare('DELETE FROM users WHERE id = :id');
$stmt->execute([':id' => 1]);
try {
$pdo->beginTransaction();
$pdo->exec("INSERT INTO logs (msg) VALUES ('Step 1')");
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
$stmt->bindValue(':id', $id, PDO::PARAM_INT)execute 多組參數或使用交易批次提交PDO::PARAM_LOB 處理大欄位PDO::ATTR_PERSISTENT => true| 現象 | 原因 | 解決 |
|---|---|---|
| could not find driver | PDO 驅動未安裝/啟用 | 安裝 php-pdo-mysql 並啟用擴充 |
| SQLSTATE[HY000] [2002] | 主機/埠號/Socket 錯誤 | 檢查 DSN host/port/unix_socket |
| 陣列轉字串錯誤 | 直接 echo 陣列/物件 | 使用 print_r/var_dump 或 json_encode |