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

PHP PDO 資料庫抽象層完整入門指南

     編輯:PHP 綜合知識

什麼是 PDO?

PDO(PHP Data Objects) 是 PHP 5.1+ 內建的輕量級資料庫抽象層,提供統一介面操作多種資料庫(MySQL、PostgreSQL、SQLite 等),支援預備語句、事務、錯誤處理等現代特性。

常用預定義常數

常數用途
PDO::PARAM_BOOL布林型別
PDO::PARAM_NULLNULL 型別
PDO::PARAM_INT整數型別
PDO::PARAM_STR字串型別
PDO::PARAM_LOB大型物件型別
PDO::FETCH_LAZY以物件屬性名對應欄位名
PDO::FETCH_ORI_NEXT取下一行
PDO::FETCH_ORI_PRIOR取上一行
PDO::FETCH_ORI_FIRST取第一行
PDO::FETCH_ORI_LAST取最後一行
PDO::ATTR_PERSISTENT建立持久連線

核心操作範例

1. 建立連線(含例外處理)

<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    // 設定錯誤模式為例外
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}
?>

2. 預備語句:命名參數風格

<?php
$stmt = $dbh->prepare("INSERT INTO registry (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

$name = 'one';  $value = 1;  $stmt->execute();
$name = 'two';  $value = 2;  $stmt->execute();
?>

3. 預備語句:問號佔位符風格

<?php
$stmt = $dbh->prepare("INSERT INTO registry (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

$name = 'one';  $value = 1;  $stmt->execute();
$name = 'two';  $value = 2;  $stmt->execute();
?>

4. 查詢資料

<?php
$stmt = $dbh->prepare("SELECT * FROM registry WHERE name = ?");
if ($stmt->execute(array($_GET['name']))) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        print_r($row);
    }
}
?>

進階技巧

事務處理

<?php
try {
    $dbh->beginTransaction();
    $dbh->exec("INSERT INTO users (name) VALUES ('Alice')");
    $dbh->exec("INSERT INTO logs (action) VALUES ('add user')");
    $dbh->commit();
} catch (Exception $e) {
    $dbh->rollBack();
    echo "Failed: " . $e->getMessage();
}
?>

常用取得模式

  • PDO::FETCH_ASSOC:關聯陣列
  • PDO::FETCH_NUM:數值索引陣列
  • PDO::FETCH_BOTH:兩者皆有(預設)
  • PDO::FETCH_OBJ:匿名物件
  • PDO::FETCH_CLASS:映射到指定類別

為什麼推薦 PDO?

  • ✅ 防 SQL 注入(預備語句自動處理跳脫)
  • ✅ 統一 API,切換資料庫成本低
  • ✅ 物件導向風格,程式碼更易維護
  • ✅ 支援事務、預備語句、多種取得模式
  • ✅ PHP 核心內建,無需額外安裝

遷移建議

舊專案使用 mysql_* 或 mysqli 的程式碼,建議漸進式重構為 PDO,優先處理有使用者輸入參與的查詢語句。

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