三大 API 對比
| 特性 | mysql (已棄用) | mysqli | PDO |
| PHP 版本 | < 5.5 移除 | >= 5.0 | >= 5.1 |
| 面向對象 | 不支援 | 支援 | 支援 |
| 預處理語句 | 不支援 | 支援 | 支援 |
| 多數據庫 | 僅 MySQL | 僅 MySQL | 支援 12+ 驅動 |
| 事務控制 | 函數式 | OO + 函數 | OO |
| 異步查詢 | 不支援 | 支援 | 不支援 |
連接模式深度解析
- mysql_connect:短連接,每次請求建立、關閉 TCP 連接,開銷大。
- mysql_pconnect:長連接(進程級連接池),PHP-FPM 模式下進程復用連接,減少握手開銷,但易導致「太多連接」、事務殘留、鎖不釋放。
- mysqli:默認短連接,
mysqli::real_connect 可配置持久連接(MYSQLI_CLIENT_PERSISTENT),行為同 pconnect。
- PDO:
PDO::ATTR_PERSISTENT => true 啟用持久連接,同樣需謹慎。
代碼範例
mysqli 面向過程
$conn = mysqli_connect('localhost', 'root', '123', 'db_test');
$sql = "SELECT * FROM db_table";
$res = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($res)) echo $row['title'];
mysqli 面向對象
$conn = new mysqli('localhost', 'root', '123', 'db_test');
$res = $conn->query("SELECT * FROM db_table");
while ($row = $res->fetch_assoc()) echo $row['title'];
PDO(推薦生產)
$pdo = new PDO('mysql:host=localhost;dbname=db_test;charset=utf8mb4', 'root', '123', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false, // 真實預處理
]);
$stmt = $pdo->prepare("SELECT * FROM db_table WHERE id = ?");
$stmt->execute([$id]);
while ($row = $stmt->fetch()) echo $row['title'];
最佳實踐建議
- 新項目強制使用 PDO:跨庫遷移無痛、真實預處理防注入、異常模式統一。
- 嚴禁 mysql_* 函數:PHP 7 已完全移除。
- 生產環境慎用持久連接:除非極高 QPS 且經過壓測驗證,否則短連接 + 連接池(如 ProxySQL)更可控。
- 預處理 + 參數綁定:杜絕 SQL 拼接,防注入、執行計劃復用。
- 字符集顯式指定:DSN 加
charset=utf8mb4 或 $pdo->exec("SET NAMES utf8mb4")。