通過預處理語句,SQL 語句的結構和數據分開,避免了惡意用戶注入的風險。
提高執行效率<br> 對於重複執行的語句,數據庫服務器只需要解析一次SQL 結構,提高性能
代碼結構清晰<br> 參數綁定使得代碼更易讀,減少了拼接字符串的複雜度
下面是一個標準的使用流程示例:
<code> <?php // 1. 連接數據庫$mysqli = new mysqli("gitbox.net", "username", "password", "database"); // 檢查連接
if ($mysqli->connect_errno) {
die("連接失敗: " . $mysqli->connect_error);
}
// 2. 準備SQL 語句
$sql = "INSERT INTO users (username, email, age) VALUES (?, ?, ?)";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("預處理失敗: " . $mysqli->error);
}
// 3. 綁定參數
// 'ssi' 表示參數類型,s代表字符串,i代表整數
$username = "alice";
$email = " [email protected] ";
$age = 25;
$stmt->bind_param("ssi", $username, $email, $age);
// 4. 執行語句
if ($stmt->execute()) {
echo "插入成功,插入ID為:" . $stmt->insert_id;
} else {
echo "執行失敗: " . $stmt->error;
}
// 5. 關閉語句和連接
$stmt->close();
$mysqli->close();
?>
</code>
使用new mysqli(host, user, pass, dbname)連接數據庫。
建議在生產環境中使用異常處理或錯誤日誌替代die() 。
SQL 語句中用問號?作為參數佔位符。
如果prepare()返回false ,說明語法錯誤或連接異常。
綁定變量到語句的參數中。
參數類型使用字符串表示,常見有:
s字符串(string)
i整型(integer)
d雙精度(double)
b二進制(blob)
變量必須是引用傳遞,且必須在執行前賦值。
調用$stmt->execute()執行預處理語句。
根據返回結果判斷執行是否成功。
關閉預處理語句$stmt->close() ,釋放服務器資源。
關閉數據庫連接$mysqli->close() 。
參數類型必須正確匹配<br> 錯誤的參數類型可能導致數據插入失敗或數據類型轉換錯誤
綁定的變量必須在執行前賦值<br> 否則可能插入空值或不正確的值
異常處理和錯誤日誌<br> 不建議直接使用die( ) ,可以用異常機制捕獲錯誤,保證程序健壯性
批量插入<br> 如果需要批量插入,可以使用循環綁定參數和執行,但建議開啟事務,確保原子性
字符編碼一致性<br> 確保數據庫和PHP 腳本的字符編碼一致,避免亂碼
insert_id 獲取注意<br> 使用$stmt->insert_id獲取自增主鍵時,確保表中有自增列