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

PHP PDO 核心概念與實務操作指南:連線、預處理、交易與效能

     編輯:PHP 綜合知識

系統整理 PHP Data Objects (PDO) 核心架構:抽象介面層、三大預定義類別、資料庫驅動啟用、參數綁定與預編譯優勢、交易處理範例、效能基準與適用場景分析。

PDO 架構定位

  • PDO 本身是抽象介面層,不直接操作資料庫。
  • 必須搭配具體驅動(pdo_mysql, pdo_pgsql, pdo_sqlite 等)使用。
  • 啟用方式:php.ini 取消註解 extension=php_pdo.dll 及對應驅動。

三大預定義類別

類別職責關鍵方法
PDO資料庫連線代表prepare(), query(), exec(), beginTransaction(), commit(), rollBack(), lastInsertId()
PDOStatement預處理語句與結果集execute(), fetch(), fetchAll(), bindParam(), bindValue(), rowCount()
PDOException例外處理getMessage(), getCode()

連線與基本操作範例

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=photo;charset=utf8", "root", "123456");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    die("連線失敗: " . $e->getMessage());
}

// 查詢
$stmt = $pdo->query("SELECT * FROM users WHERE status = 1");
$users = $stmt->fetchAll();

// 新增(預處理 + 參數綁定)
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute(['john', 'john@example.com', password_hash('secret', PASSWORD_DEFAULT)]);
$newId = $pdo->lastInsertId();
?>

交易處理完整範例

<?php
try {
    $pdo->beginTransaction();
    
    $amt = 250;
    $pdo->exec("UPDATE users SET money = money - $amt WHERE id = 1");
    $pdo->exec("UPDATE users SET money = money + $amt WHERE id = 2");
    // 故意拼錯欄位名模擬失敗:money → monet
    $pdo->exec("UPDATE users SET monet = money - $amt WHERE id = 3");
    
    $pdo->commit();
    echo "轉帳成功";
} catch (Exception $e) {
    $pdo->rollBack();
    echo "轉帳失敗: " . $e->getMessage();
}
?>

交易四大特性 (ACID):原子性、一致性、隔離性、持久性。需資料表引擎為 InnoDB。

參數綁定與預編譯優勢

  1. 防 SQL 注入:參數與 SQL 結構分離,驅動層負責轉義。
  2. 效能提升:相同 SQL 重複執行時,資料庫可重用執行計畫(軟解析)。
  3. bindParam() 參考綁定 vs bindValue() 值綁定,前者適合迴圈重複執行。

效能基準參考

指標PDOmysqli (原生)說明
CRUD 效能較低 5-15%基準抽象層額外開銷
長連線負載較高且穩定較低PDO 連線池管理較好
記憶體使用略高較低物件封裝開銷

實務建議

  • 新專案首選 PDO:可攜性、安全性、物件導風格優於 mysqli。
  • 極致效能敏感場景(高頻簡單查詢)可考慮 mysqli 原生。
  • 永遠啟用 ERRMODE_EXCEPTION,統一用 try-catch 處理錯誤。
  • 使用具名參數 :name 提升 SQL 可讀性。
  • 90% 專案不會跨資料庫遷移,但 PDO 的抽象層成本極低,收益遠大於成本。

掌握 PDO 核心 API 與最佳實務,能編寫安全、可維護、跨資料庫相容的資料存取層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved