首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 5.2+ PDO 資料庫操作入門完整指南

     編輯:PHP 綜合知識

為什麼選擇 PDO?

  • 統一介面支援 12+ 資料庫驅動
  • 預處理語句有效防止 SQL 注入
  • 物件導向風格,程式碼更易維護
  • PHP 5.1 內建,無需額外安裝(僅需啟用擴充)

環境啟用

編輯 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;

核心操作範例

1. 建立連線與錯誤處理

<?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('資料庫連線失敗,請稍後再試');
}

2. 新增資料

$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();

3. 查詢單筆/多筆

// 單筆
$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();  // 回傳二維陣列

4. 更新與刪除

// 更新
$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]);

5. 交易控制

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 處理大欄位
  • 連線池:PHP-FPM 環境下善用持久連線 PDO::ATTR_PERSISTENT => true

常見錯誤排查

現象原因解決
could not find driverPDO 驅動未安裝/啟用安裝 php-pdo-mysql 並啟用擴充
SQLSTATE[HY000] [2002]主機/埠號/Socket 錯誤檢查 DSN host/port/unix_socket
陣列轉字串錯誤直接 echo 陣列/物件使用 print_r/var_dump 或 json_encode
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved