當前位置: 首頁> 最新文章列表> 使用mysqli_stmt::prepare 處理INSERT 操作

使用mysqli_stmt::prepare 處理INSERT 操作

gitbox 2025-05-26

一、為什麼使用mysqli_stmt::prepare 進行INSERT 操作?


  1. 通過預處理語句,SQL 語句的結構和數據分開,避免了惡意用戶注入的風險。

  2. 提高執行效率<br> 對於重複執行的語句,數據庫服務器只需要解析一次SQL 結構,提高性能

  3. 代碼結構清晰<br> 參數綁定使得代碼更易讀,減少了拼接字符串的複雜度


二、使用mysqli_stmt::prepare 處理INSERT 的完整流程

下面是一個標準的使用流程示例:

<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>


三、各步驟詳細說明

1. 創建mysqli 對象連接數據庫

使用new mysqli(host, user, pass, dbname)連接數據庫。
建議在生產環境中使用異常處理或錯誤日誌替代die()

2. 使用prepare() 創建預處理語句

  • SQL 語句中用問號?作為參數佔位符。

  • 如果prepare()返回false ,說明語法錯誤或連接異常。

3. 綁定參數bind_param()

  • 綁定變量到語句的參數中。

  • 參數類型使用字符串表示,常見有:

    • s字符串(string)

    • i整型(integer)

    • d雙精度(double)

    • b二進制(blob)

  • 變量必須是引用傳遞,且必須在執行前賦值。

4. 執行execute()

  • 調用$stmt->execute()執行預處理語句。

  • 根據返回結果判斷執行是否成功。

5. 關閉資源

  • 關閉預處理語句$stmt->close() ,釋放服務器資源。

  • 關閉數據庫連接$mysqli->close()


四、使用mysqli_stmt::prepare 處理INSERT 操作的注意事項

  1. 參數類型必須正確匹配<br> 錯誤的參數類型可能導致數據插入失敗或數據類型轉換錯誤

  2. 綁定的變量必須在執行前賦值<br> 否則可能插入空值或不正確的值

  3. 異常處理和錯誤日誌<br> 不建議直接使用die( ) ,可以用異常機制捕獲錯誤,保證程序健壯性

  4. 批量插入<br> 如果需要批量插入,可以使用循環綁定參數和執行,但建議開啟事務,確保原子性

  5. 字符編碼一致性<br> 確保數據庫和PHP 腳本的字符編碼一致,避免亂碼

  6. insert_id 獲取注意<br> 使用$stmt->insert_id獲取自增主鍵時,確保表中有自增列