PHP 5.5 棄用、PHP 7.0 移除 mysql_* 系列函數,mysqli(MySQL Improved)與 PDO 成為唯一官方支援選項。本文深度對比兩者架構差異、API 風格、效能特性、預處理語句、事務處理,並提供遷移實戰清單。
| 特性 | mysql (舊) | mysqli (新) |
|---|---|---|
| 連線模式 | 非持久(每次呼叫新連線) | 支援持久連線(mysqli::persistent) |
| API 風格 | 僅程序式 | 程序式 + 物件導向雙模式 |
| 預處理語句 | 不支援 | 完整支援(防 SQL 注入核心) |
| 多重查詢 | 不支援 | 支援 multi_query() |
| 事務控制 | 僅 mysql_query("COMMIT") | autocommit(), commit(), rollback() |
| 增強除錯 | 無 | mysqli_report(), errno/error 屬性 |
| 非同步查詢 | 不支援 | 支援 poll(), reap_async_query() |
| PHP 版本支援 | ≤ 5.6(已移除) | ≥ 5.0(持續維護) |
原因:PHP 編譯/安裝時未啟用 mysqli 擴展。
Linux (編譯/套件)
// 舊 $link = mysql_connect('localhost', 'user', 'pass'); mysql_select_db('dbname', $link); // 新 - 程序式 $link = mysqli_connect('localhost', 'user', 'pass', 'dbname'); if (!$link) die('Connect Error: ' . mysqli_connect_error()); // 新 - 物件導向 (推薦) $mysqli = new mysqli('localhost', 'user', 'pass', 'dbname'); if ($mysqli->connect_errno) die('Connect Error: ' . $mysqli->connect_error); $mysqli->set_charset('utf8mb4'); // 關鍵:設定字元集查詢與結果集
query("SELECT * FROM users WHERE id=1"); $row = $res->fetch_assoc(); $res->free();預處理語句(防注入核心,mysqli 獨有)
bind_param("si", $email, $status); // s=string, i=integer, d=double, b=blob $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { /* ... */ } $stmt->close();事務處理
query("UPDATE inventory SET qty=qty-1 WHERE id=1"); $mysqli->commit(); } catch (Exception $e) { $mysqli->rollback(); throw $e; } $mysqli->autocommit(true);錯誤處理(推薦模式)