在PHP中,mysqli
(MySQL Improved Extension)是操作MySQL數據庫的擴展庫,提供了面向對象和過程式兩種風格。以下是mysqli
的基本操作方法:
1. 連接數據庫
面向對象風格
$mysqli = new mysqli('localhost', 'username', 'password', 'database_name');// 檢查連接是否成功
if ($mysqli->connect_error) {die("連接失敗: " . $mysqli->connect_error);
}echo "連接成功";
過程式風格
$conn = mysqli_connect('localhost', 'username', 'password', 'database_name');if (!$conn) {die("連接失敗: " . mysqli_connect_error());
}echo "連接成功";
2. 執行查詢(SELECT)
// 準備SQL語句
$sql = "SELECT id, name, email FROM users";
$result = $mysqli->query($sql);// 檢查查詢結果
if ($result->num_rows > 0) {// 輸出數據while ($row = $result->fetch_assoc()) {echo "ID: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";}
} else {echo "0 結果";
}// 釋放結果集
$result->free();
3. 預處理語句(防止SQL注入)
// 準備SQL語句
$sql = "SELECT id, name, email FROM users WHERE age > ?";
$stmt = $mysqli->prepare($sql);// 綁定參數
$age = 18;
$stmt->bind_param("i", $age); // "i" 表示整數類型// 執行查詢
$stmt->execute();// 獲取結果
$result = $stmt->get_result();// 處理結果
while ($row = $result->fetch_assoc()) {echo "ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}// 關閉預處理語句
$stmt->close();
4. 插入數據
// 準備SQL語句
$sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
$stmt = $mysqli->prepare($sql);// 綁定參數
$name = "John Doe";
$email = "john@example.com";
$age = 30;
$stmt->bind_param("ssi", $name, $email, $age); // "ssi" 表示兩個字符串和一個整數// 執行插入
if ($stmt->execute()) {echo "新記錄插入成功,ID: " . $stmt->insert_id;
} else {echo "Error: " . $stmt->error;
}// 關閉預處理語句
$stmt->close();
5. 更新數據
// 準備SQL語句
$sql = "UPDATE users SET age = ? WHERE id = ?";
$stmt = $mysqli->prepare($sql);// 綁定參數
$newAge = 31;
$id = 1;
$stmt->bind_param("ii", $newAge, $id);// 執行更新
if ($stmt->execute()) {echo "記錄更新成功,受影響的行數: " . $stmt->affected_rows;
} else {echo "Error: " . $stmt->error;
}// 關閉預處理語句
$stmt->close();
6. 刪除數據
// 準備SQL語句
$sql = "DELETE FROM users WHERE id = ?";
$stmt = $mysqli->prepare($sql);// 綁定參數
$id = 1;
$stmt->bind_param("i", $id);// 執行刪除
if ($stmt->execute()) {echo "記錄刪除成功,受影響的行數: " . $stmt->affected_rows;
} else {echo "Error: " . $stmt->error;
}// 關閉預處理語句
$stmt->close();
7. 事務處理
// 開始事務
$mysqli->begin_transaction();try {// 執行多個SQL操作$mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");$mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");// 提交事務$mysqli->commit();echo "事務執行成功";
} catch (Exception $e) {// 回滾事務$mysqli->rollback();echo "事務失敗: " . $e->getMessage();
}
8. 關閉連接
$mysqli->close();
mysqli與PDO的對比
特性 | mysqli | PDO |
---|---|---|
數據庫支持 | 僅MySQL | 支持多種數據庫(MySQL、PostgreSQL等) |
面向對象 | 支持(也支持過程式) | 僅面向對象 |
預處理語句 | 支持 | 支持 |
錯誤處理 | 支持異常模式 | 支持異常模式 |
事務處理 | 支持 | 支持 |
跨數據庫兼容性 | 無 | 高 |
總結
mysqli
是專門為MySQL設計的擴展,性能略高。- 預處理語句是防止SQL注入的關鍵,強烈推薦使用。
- 事務處理可確保數據的一致性。
- 對于跨數據庫項目,建議使用PDO。
以上示例展示了mysqli
的基本用法,實際開發中建議結合異常處理和預處理語句,提高代碼的安全性和可維護性。