MySQLi(MySQL Improved)為 PHP 5.0+ 內建擴充,支援預處理語句、事務、多重查詢。本文整理物件導向(OO)與程序風格雙模式完整對照,適用 PHP > 5.0、MySQL > 4.1 環境。
1. 連線資料庫
| 模式 | 語法 | 回傳 |
| OO | $db = new mysqli($host, $user, $pass, $dbname); | mysqli 物件 |
| 程序 | $db = mysqli_connect($host, $user, $pass, $dbname); | 資源 handle |
2. 連線錯誤處理
// OO
if ($db->connect_errno) die($db->connect_error);
// 程序
if (mysqli_connect_errno()) die(mysqli_connect_error());
3. 選擇資料庫
$db->select_db($dbname); // OO
mysqli_select_db($db, $dbname); // 程序
4. 執行查詢
$result = $db->query($sql); // OO
$result = mysqli_query($db, $sql); // 程序
5. 結果集操作
| 操作 | OO | 程序 |
| 取得行數 | $result->num_rows | mysqli_num_rows($result) |
| 關聯陣列 | $result->fetch_assoc() | mysqli_fetch_assoc($result) |
| 索引陣列 | $result->fetch_row() | mysqli_fetch_row($result) |
| 物件 | $result->fetch_object() | mysqli_fetch_object($result) |
| 釋放結果 | $result->free() | mysqli_free_result($result) |
6. 關閉連線
$db->close(); // OO
mysqli_close($db); // 程序
7. 影響行數
$db->affected_rows; // OO
mysqli_affected_rows($db); // 程序
8. 預處理語句(防 SQL 注入核心)
// OO 完整流程
$stmt = $db->prepare("INSERT INTO books (isbn, author, title, price) VALUES (?, ?, ?, ?)");
$stmt->bind_param("sssd", $isbn, $author, $title, $price); // s=string, d=double, i=int, b=blob
$stmt->execute();
echo $stmt->affected_rows . " row inserted";
$stmt->close();
程序風格對應
| OO 方法 | 程序函式 |
| $db->prepare() | mysqli_stmt_prepare() |
| $stmt->bind_param() | mysqli_stmt_bind_param() |
| $stmt->execute() | mysqli_stmt_execute() |
| $stmt->affected_rows | mysqli_stmt_affected_rows() |
| $stmt->close() | mysqli_stmt_close() |
9. 事務控制
$db->autocommit(FALSE);
$db->begin_transaction(); // PHP 5.5+
// 或 $db->query('START TRANSACTION');
$db->commit(); // 或 rollback()
10. 多重查詢
$db->multi_query("SELECT * FROM t1; SELECT * FROM t2;");
do {
if ($result = $db->store_result()) {
// 處理結果集
$result->free();
}
} while ($db->more_results() && $db->next_result());
關鍵優勢總結
- 預處理語句:效能(解析一次多次執行)+ 安全(參數綁定防注入)
- 物件導向 API:程式碼可讀性高、易維護
- 支援 MySQL 5.1+ 新特性:事務、視圖、觸發器、儲存過程
新專案強烈建議直接使用 MySQLi(或 PDO),棄用已移除的 mysql_* 系列函式。