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

PHP PDO 完全指南:資料庫抽象層核心用法與最佳實踐

     編輯:PHP 相關知識

什麼是 PDO?

PDO (PHP Data Objects) 是 PHP 官方提供的資料庫抽象層擴展,為不同資料庫(MySQL、PostgreSQL、SQLite、Oracle 等)提供統一的訪問介面。它解決了跨資料庫平台開發與遷移的難題,是現代 PHP 專案的標準選擇。

一、建立資料庫連線

透過實例化 PDO 建構子,使用 DSN (Data Source Name) 字串指定資料庫類型、主機、資料庫名稱:

<?php
$dbms   = 'mysql';
$dbName = 'dormitory';
$host   = 'localhost';
$user   = 'root';
$pwd    = '';

$dsn = "$dbms:host=$host;dbname=$dbName";

try {
    $pdo = new PDO($dsn, $user, $pwd);
    // 設定錯誤模式為例外(推薦)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo '連線成功!';
} catch (PDOException $e) {
    echo '連線失敗:' . $e->getMessage();
}
?>

注意:PHP 5.2 需啟用 php_pdo.dll + php_pdo_mysql.dll;PHP 5.3+ 僅需 php_pdo_mysql.dll。

二、三種 SQL 執行方式

方法適用場景回傳值特點
exec()INSERT、UPDATE、DELETE受影響行數 (int)直接執行,無結果集
query()SELECTPDOStatement 物件一次性查詢,適合無參數 SQL
prepare() + execute()所有類型(含參數化)PDOStatement 物件預處理語句,防 SQL 注入,可重複執行

預處理語句範例(參數綁定)

<?php
$sql = "SELECT * FROM building WHERE id = ? AND status = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([1, 'active']); // 位置佔位符

// 或具名佔位符
$sql = "SELECT * FROM users WHERE username = :user AND password = :pass";
$stmt = $pdo->prepare($sql);
$stmt->execute([':user' => $username, ':pass' => $password]);

// 獲取結果
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

三、結果集獲取方法

均為 PDOStatement 物件方法:

  • fetch($mode = PDO::FETCH_ASSOC):取得下一行,單條記錄陣列/物件。
  • fetchAll($mode):取得所有行,二維陣列。
  • fetchColumn($col = 0):取得下一行指定欄位的值(純量)。
// 常用模式常數
PDO::FETCH_ASSOC   // 關聯陣列
PDO::FETCH_NUM     // 數值索引陣列
PDO::FETCH_OBJ     // 匿名物件
PDO::FETCH_CLASS   // 映射到指定類別

四、錯誤處理機制

1. 錯誤模式(連線時或後續設定)

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 推薦:拋出 PDOException
// PDO::ERRMODE_SILENT   // 預設:靜默,需手動檢查 errorCode/errorInfo
// PDO::ERRMODE_WARNING  // 觸發 E_WARNING

2. 手動獲取錯誤資訊(非例外模式下)

  • errorCode():回傳 SQLSTATE 代碼(00000 表示成功)。
  • errorInfo():回傳陣列 [SQLSTATE, 驅動代碼, 驅動訊息]。

注意:預處理語句執行後,錯誤資訊屬於 PDOStatement 物件,需呼叫 $stmt->errorCode() / $stmt->errorInfo()。

五、實用技巧:防注入登入驗證

<?php
$sql = "SELECT username, password FROM users WHERE username = ? AND password = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $password]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "登入成功";
} else {
    echo "帳號或密碼錯誤";
}
?>

總結

PDO 以統一介面、預處理語句、多種獲取模式、靈活錯誤處理,成為 PHP 資料庫操作的基石。掌握 prepare/execute、錯誤模式設定、結果集獲取三大核心,即可應對絕大多數業務場景。

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