隨著 PHP 7+ 棄用 mysql 擴展,mysqli(MySQL Improved)成為原生連接首選:支援面向對象/過程雙風格、預處理語句、事務控制、多語句執行、效能更優。本文聚焦 OO 風格,從安裝驗證到核心 CRUD、結果集遍歷、事務與預處理最佳實踐。
php.ini 啟用:extension=php_mysqli.dll(Windows)或 extension=mysqli.so(Linux),確認 extension_dir 正確。// 1. 直接連線測試
$mysqli = new mysqli('localhost', 'root', '', 'test');
// 2. phpinfo() 搜尋 mysqli 區塊
// 3. 程式檢查
var_dump(extension_loaded('mysqli')); // bool(true)
print_r(get_loaded_extensions());
// 1. 建立連線(構造函數自動連線)
$mysqli = new mysqli(HOST, USER, PWD, DB);
if ($mysqli->connect_errno) {
die("Connect Error: " . $mysqli->connect_error);
}
// 2. 設定字符集(防亂碼)
$mysqli->set_charset('utf8');
// 3. 執行查詢
$sql = "SELECT * FROM test";
$result = $mysqli->query($sql); // 返回 mysqli_result 或 false
// 4. 遍歷結果集
// 一次性取所有關聯陣列
$rows = $result->fetch_all(MYSQLI_ASSOC); // MYSQLI_NUM / MYSQLI_BOTH
// 指針定位 + 逐行取數
$result->data_seek(2);
$row = $result->fetch_row(); // 數值索引陣列
$row = $result->fetch_assoc(); // 關聯陣列
$row = $result->fetch_object(); // 物件
// 5. 釋放結果集
$result->free(); // 或 free_result(), close()
// 6. 關閉連線
$mysqli->close();
$mysqli->query("INSERT INTO test (title) VALUES ('demo')");
$affected = $mysqli->affected_rows; // -1:SQL錯誤, 0:無影響, >0:影響行數
| 特性 | 關鍵 API | 場景 |
|---|---|---|
| 多語句執行 | multi_query() + next_result() | 批次導入、DDL 組合 |
| 預處理語句 | prepare() → bind_param() → execute() → bind_result() → fetch() | 防 SQL 注入、重複執行優化 |
| 事務控制 | autocommit(false) → commit()/rollback() | 轉賬、訂單等 ACID 業務 |
| 存儲過程調用 | query("CALL proc()") | 複雜邏輯下沉 |
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // s=string, i=int, d=double, b=blob
$name = "Alice"; $email = "alice@example.com";
$stmt->execute();
$stmt->close();
query() 返回 false 未判斷 → ✅ 檢查 $mysqli->errno / error。free() 導致記憶體洩漏 → ✅ 用完即釋放。ping() 自動重連或用連線池。掌握 mysqli OO API,告別舊擴展,構建安全高效的 PHP 資料存取層。