首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 連接 MySQL:mysqli 與 PDO 兩種方式完整對比

     編輯:MySQL 資料庫相關知識

從舊式 mysql 擴展到現代化資料庫抽象層

PHP 官方已移除 `mysql_*` 函數 (PHP 7.0),現代開發應使用 `mysqli` (MySQL Improved) 或 `PDO` (PHP Data Objects)。

環境準備

CREATE DATABASE test;
USE test;
CREATE TABLE user (name VARCHAR(50), age INT);
INSERT INTO user VALUES ('harry',20), ('tony',23), ('harry',24);

方式一:mysqli 面向過程風格

$conn = mysqli_connect('localhost', 'root', 'root', 'test');
mysqli_set_charset($conn, 'utf8');
$name = mysqli_real_escape_string($conn, 'harry');
$sql = "SELECT * FROM user WHERE name = '$name'";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    echo "Name: {$row['name']} Age: {$row['age']}\n";
}
mysqli_close($conn);

方式二:PDO (推薦,支援多資料庫)

$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("SELECT * FROM user WHERE name = ?");
$stmt->execute(['harry']);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "Name: {$row['name']} Age: {$row['age']}\n";
}
$pdo = null; // 關閉連線

核心差異對比

特性mysqliPDO
資料庫支援僅 MySQL12+ 驅動 (MySQL, PG, SQLite, Oracle...)
API 風格面向過程 + 物件純物件導向
預處理支援 (`prepare`/`bind_param`)支援 (命名/問號佔位符)
異常處理需手動檢查返回值可設 `ERRMODE_EXCEPTION` 自動拋出
事務`begin_transaction()`/`commit()``beginTransaction()`/`commit()`
調試較難打印完整 SQL`debugDumpParams()` 顯示綁定參數

最佳實踐建議

  • 新專案優先選 **PDO**,便於未來遷移資料庫。
  • 務必使用 **預處理語句** 防 SQL 注入,嚴禁字串拼接變數。
  • 設定 `ATTR_ERRMODE => ERRMODE_EXCEPTION` 統一錯誤處理。
  • 長連線池生產環境可搭配 `PDO::ATTR_PERSISTENT` 或 Swoole/Workerman 連線池。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved