相比過程式風格,mysqli 面向對象 API 更符合現代 PHP 開發習慣:代碼結構清晰、方法鏈調用優雅、異常處理自然、與 PDO 風格一致,便於遷移與維護。
new MySQLi()select_db()、query("SET NAMES utf8")query($sql) 返回 mysqli_result 對象fetch_assoc()、fetch_row()、fetch_object()free() 釋放結果集、close() 關閉連線<?php
// 1. 建立連線
$mysqli = new MySQLi("localhost", "root", "123456");
if ($mysqli->connect_error) {
die("連線失敗: " . $mysqli->connect_errno . " -- " . $mysqli->connect_error);
}
// 2. 選擇資料庫與字符集
$mysqli->select_db("liuyan");
$mysqli->query("SET NAMES 'utf8'"); // 強烈建議使用 utf8mb4
// 3. 執行查詢
$sql = "SELECT title, contents FROM news LIMIT 5, 5";
$res = $mysqli->query($sql);
if (!$res) {
die("查詢失敗: " . $mysqli->error);
}
// 4. 遍歷結果集
while ($row = $res->fetch_assoc()) {
echo "標題:" . htmlspecialchars($row['title']) . "<br>";
echo "內容:" . htmlspecialchars($row['contents']) . "<hr>";
}
// 5. 釋放資源並關閉連線
$res->free();
$mysqli->close();
?>
| 方法 | 返回類型 | 適用場景 |
|---|---|---|
fetch_assoc() | 關聯數組 ['column' => value] | 最常用,欄位名可讀性強 |
fetch_row() | 索引數組 [0 => value] | 高性能、欄位固定、不需名稱 |
fetch_object() | 對象 stdClass 或指定類 | 物件導向映射、領域模型 |
fetch_all(MYSQLI_ASSOC) | 二維數組(一次性獲取所有) | 小結果集、需多次遍歷、JSON 輸出 |
從資料庫讀取的數據直接輸出到 HTML 必須轉義:
echo htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
echo "總行數: " . $res->num_rows . "<br>";
echo "欄位數: " . $res->field_count . "<br>";
// 獲取欄位信息
while ($field = $res->fetch_field()) {
echo "欄位: {$field->name}, 類型: {$field->type}, 長度: {$field->length}<br>";
}
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli = new MySQLi("localhost", "root", "123456", "liuyan");
$mysqli->set_charset("utf8mb4");
$res = $mysqli->query("SELECT * FROM news LIMIT 10");
$data = $res->fetch_all(MYSQLI_ASSOC);
$res->free();
} catch (mysqli_sql_exception $e) {
error_log("資料庫錯誤: " . $e->getMessage());
// 用戶友好提示
echo "系統繁忙,請稍後再試";
}
高併發場景可啟用持久連線(慎用):
$mysqli = new MySQLi("p:localhost", "root", "123456", "liuyan");
注意:持久連線可能導致連線數耗盡、狀態殘留(如事務未提交),需配合連線池或框架管理。
SET NAMES utf8 或資料庫/表/欄位編碼不一致query() 失敗返回 false,未判斷直接調用 fetch_assoc()fetch_all(),改用逐行 fetch_assoc()mysqli 面向對象查詢是 PHP 操作 MySQL 的基石。掌握標準五步流程、結果集多種獲取方式、異常處理模式與資源管理,能編寫出健壯、高效、安全的資料訪問代碼。實戰中建議封裝為 Repository 層或使用成熟 ORM(如 Doctrine、Eloquent),專注業務邏輯開發。