預處理核心價值
- 性能:SQL 模板預編譯,重複執行無需再次解析優化
- 安全:參數綁定徹底防 SQL 注入
- 穩定:類型檢查減少運行時錯誤
場景一:綁定參數
<?php
$mysqli = new mysqli("localhost", "root", "", "volunteer");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare("INSERT INTO `vol_msg`(mid, content) VALUES(?, ?)");
// 綁定類型:i=整數, s=字符串, d=雙精度, b=Blob
$stmt->bind_param("is", $id, $content);
$id = ""; // 自增主鍵傳空字符串或 0
$content = "這是插入的內容";
$stmt->execute();
echo "Row inserted: " . $stmt->affected_rows;
// 批量插入:重複賦值+execute,無需再次 prepare
$content = "第二條數據";
$stmt->execute();
$mysqli->close();
?>
場景二:綁定結果
<?php
$mysqli = new mysqli("localhost", "root", "", "volunteer");
mysqli_query($mysqli, "SET NAMES utf8");
$stmt = $mysqli->prepare("SELECT mid, content FROM `vol_msg`");
$stmt->execute();
$stmt->bind_result($id, $content);
while ($stmt->fetch()) {
echo "第 {$id} 條: {$content}<br/>";
}
$mysqli->close();
?>
關鍵方法速查
| 方法 | 用途 |
| prepare() | 創建預處理語句對象 |
| bind_param() | 綁定輸入參數(類型+變量引用) |
| bind_result() | 綁定輸出列到變量 |
| execute() | 執行預處理語句 |
| fetch() | 獲取下一行綁定結果 |
| free_result() | 釋放結果集內存 |
| close() | 關閉語句對象 |
類型代碼對照表
i - Integer (整數)
d - Double (浮點數)
s - String (字符串)
b - Blob (二進制數據,需分包發送)
最佳實踐
- 所有動態參數查詢強制使用預處理
- 批量操作時:
prepare一次 → 循環bind_param+execute
- 及時
free_result() 和 close() 釋放資源
- 錯誤處理:檢查
$stmt->errno 和 $stmt->error