首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP mysqli 面向對象查詢完全指南:從連線到結果集釋放

     編輯:PHP 綜合知識

mysqli 面向對象風格優勢

相比過程式風格,mysqli 面向對象 API 更符合現代 PHP 開發習慣:代碼結構清晰、方法鏈調用優雅、異常處理自然、與 PDO 風格一致,便於遷移與維護。

標準查詢流程五步法

  1. 建立連線:new MySQLi()
  2. 選擇資料庫/設置字符集:select_db()、query("SET NAMES utf8")
  3. 執行查詢:query($sql) 返回 mysqli_result 對象
  4. 遍歷結果集:fetch_assoc()、fetch_row()、fetch_object()
  5. 資源清理: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 輸出

進階技巧與最佳實踐

1. 防止 XSS:輸出轉義

從資料庫讀取的數據直接輸出到 HTML 必須轉義:

echo htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');

2. 獲取元數據

echo "總行數: " . $res->num_rows . "<br>";
echo "欄位數: " . $res->field_count . "<br>";

// 獲取欄位信息
while ($field = $res->fetch_field()) {
    echo "欄位: {$field->name}, 類型: {$field->type}, 長度: {$field->length}<br>";
}

3. 異常處理模式(PHP 7+)

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 "系統繁忙,請稍後再試";
}

4. 連線複用與持久連線

高併發場景可啟用持久連線(慎用):

$mysqli = new MySQLi("p:localhost", "root", "123456", "liuyan");

注意:持久連線可能導致連線數耗盡、狀態殘留(如事務未提交),需配合連線池或框架管理。

常見錯誤排查

  • 亂碼:未設置 SET NAMES utf8 或資料庫/表/欄位編碼不一致
  • Call to member function on null:query() 失敗返回 false,未判斷直接調用 fetch_assoc()
  • Commands out of sync:多查詢未釋放結果集就執行下一條
  • 內存溢出:大結果集使用 fetch_all(),改用逐行 fetch_assoc()

總結

mysqli 面向對象查詢是 PHP 操作 MySQL 的基石。掌握標準五步流程、結果集多種獲取方式、異常處理模式與資源管理,能編寫出健壯、高效、安全的資料訪問代碼。實戰中建議封裝為 Repository 層或使用成熟 ORM(如 Doctrine、Eloquent),專注業務邏輯開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved