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

PHP mysqli 擴展完整入門:面向對象風格核心 API 實戰

     編輯:MySQL 綜合教學

PHP mysqli 擴展完整入門:面向對象風格核心 API 實戰

隨著 PHP 7+ 棄用 mysql 擴展,mysqli(MySQL Improved)成為原生連接首選:支援面向對象/過程雙風格、預處理語句、事務控制、多語句執行、效能更優。本文聚焦 OO 風格,從安裝驗證到核心 CRUD、結果集遍歷、事務與預處理最佳實踐。

一、安裝與驗證

  1. php.ini 啟用:extension=php_mysqli.dll(Windows)或 extension=mysqli.so(Linux),確認 extension_dir 正確。
  2. 重啟 Web 服務/ PHP-FPM。
  3. 驗證三法:
// 1. 直接連線測試
$mysqli = new mysqli('localhost', 'root', '', 'test');

// 2. phpinfo() 搜尋 mysqli 區塊

// 3. 程式檢查
var_dump(extension_loaded('mysqli')); // bool(true)
print_r(get_loaded_extensions());

二、OO 風格核心工作流

// 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 資料存取層。

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