當我們執行多條插入操作或在事務中插入數據時,直接通過mysqli->insert_id讀取自增ID 可能會不准確,尤其是在多線程或多用戶並發訪問時。使用預處理語句的$insert_id屬性,可以確保獲得當前語句影響的插入ID。
mysqli_stmt::$insert_id是在PHP 8.1 及以後版本中新增的屬性,專門用於獲取執行預處理語句後的自增ID,相比$mysqli->insert_id更加精確和安全。
以下示例演示瞭如何在事務中使用mysqli_stmt執行插入操作,並獲取插入記錄的ID:
<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
// 開啟事務
$mysqli->begin_transaction();
try {
// 預處理插入語句
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
$username = 'alice';
$email = '[email protected]';
$stmt->bind_param("ss", $username, $email);
// 執行插入
$stmt->execute();
// 獲取插入的 ID
$insertId = $stmt->insert_id;
echo "新插入用戶的ID是: " . $insertId . "\n";
// 提交事務
$mysqli->commit();
$stmt->close();
} catch (Exception $e) {
// 發生錯誤回滾事務
$mysqli->rollback();
echo "事務失敗,已回滾。錯誤訊息: " . $e->getMessage();
}
$mysqli->close();
?>
在事務中執行插入操作時,先調用$mysqli->begin_transaction()開啟事務,操作結束後調用$mysqli->commit()提交,失敗則調用$mysqli->rollback()回滾。
使用mysqli_stmt預處理語句執行插入,避免SQL 注入風險。
插入成功後,通過$stmt->insert_id獲取本次插入的自增ID,確保准確無誤。
異常處理中一定要回滾事務,保證數據的一致性和完整性。
mysqli_stmt::$insert_id僅在PHP 8.1 及以上版本可用。如果使用的是舊版本PHP,可以考慮用$mysqli->insert_id ,但要注意並發問題。