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

PDO 連接 MySQL 完整學習筆記:從基礎配置到事務與預處理語句

     編輯:MySQL 綜合教學

前言

PHP Data Objects (PDO) 提供了一個輕量級、一致性的介面來訪問數據庫。本文整理了 PDO 連接 MySQL 的核心知識點,涵蓋 DSN 配置三種寫法、事務處理機制、預處理語句與參數綁定的區別,適合作為快速查閱的參考手冊。

一、DSN (Data Source Name) 三種配置方式

建立 PDO 連接的第一步是定義 DSN,主要有以下三種形式:

1. 標準完整寫法

<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$pass = '';
try {
    $pdo = new PDO($dsn, $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Connection failed: ' . $e->getMessage());
}

2. URI 方式引用外部配置文件

將 DSN 字串存放於獨立文件,提升安全性與可維護性。

// config.txt 內容:mysql:host=localhost;dbname=testdb;charset=utf8mb4
$dsn = 'uri:file:///var/www/html/pdo/config.txt'; // Linux 路徑
// Windows 路徑示例:uri:file://C:/xampp/htdocs/pdo/config.txt

3. php.ini 中預設別名

; php.ini 中添加
pdo.dsn.mydb = "mysql:host=localhost;dbname=testdb;charset=utf8mb4"

// PHP 代碼中直接使用別名
$dsn = 'mydb';

二、事務處理:保證數據一致性

PDO 預設為自動提交模式。透過 beginTransaction() 開啟事務,配合 commit() 提交或 rollBack() 回滾。

<?php
try {
    $pdo->beginTransaction();
    
    // 執行多條 SQL 操作
    $pdo->exec("INSERT INTO accounts (user, amount) VALUES ('Alice', 100)");
    $pdo->exec("UPDATE balances SET total = total - 100 WHERE user = 'Bob'");
    
    // 模擬業務邏輯判斷
    if ($someCondition) {
        $pdo->commit(); // 提交事務
        echo "事務提交成功";
    } else {
        $pdo->rollBack(); // 回滾事務
        echo "事務已回滾";
    }
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

注意: MySQL 中 DDL 語句(如 CREATE TABLE、DROP TABLE、ALTER TABLE)會導致隱式提交,無法在事務中回滾。詳細請參考 MySQL 官方文檔。

三、預處理語句與參數綁定

預處理語句能有效防止 SQL 注入,並提升重複執行的性能。PDO 提供 prepare() 返回 PDOStatement 物件。

1. 基本用法

<?php
$sql = "SELECT * FROM users WHERE email = :email AND status = :status";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => 'test@example.com', ':status' => 1]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

2. bindParam vs bindValue 核心區別

  • bindParam:綁定變數引用(Reference),執行時讀取變數當前值。適用於循環中重複執行、存儲過程輸出參數。
  • bindValue:綁定具體值(Value),綁定瞬間即固定。適用於一次性執行。

3. 存儲過程 INOUT 參數示例

<?php
$colour = 'red';
$stmt = $pdo->prepare('CALL puree_fruit(?)');
// 參數類型:PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT,長度 12
$stmt->bindParam(1, $colour, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 12);
$stmt->execute();
print("處理後顏色變為: $colour");

四、常見錯誤處理模式

<?php
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 Error: " . $e->getMessage());
    die("系統維護中,請稍後再試。");
}

總結

掌握 PDO 的 DSN 配置、事務控制、預處理語句與參數綁定機制,是 PHP 開發者操作 MySQL 的基石。建議在項目中統一封裝數據庫連接類,集中管理錯誤處理、字符集設置與 SQL 日誌記錄。

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