當前位置: 首頁> 最新文章列表> 如何在事務處理中結合mysqli_stmt::$insert_id 獲取正確的插入ID?

如何在事務處理中結合mysqli_stmt::$insert_id 獲取正確的插入ID?

gitbox 2025-06-03

1. 事務與插入ID 獲取的挑戰

當我們執行多條插入操作或在事務中插入數據時,直接通過mysqli->insert_id讀取自增ID 可能會不准確,尤其是在多線程或多用戶並發訪問時。使用預處理語句的$insert_id屬性,可以確保獲得當前語句影響的插入ID。

2. mysqli_stmt::$insert_id簡介

mysqli_stmt::$insert_id是在PHP 8.1 及以後版本中新增的屬性,專門用於獲取執行預處理語句後的自增ID,相比$mysqli->insert_id更加精確和安全。


3. 示例代碼

以下示例演示瞭如何在事務中使用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();
?>

4. 關鍵點總結

  • 在事務中執行插入操作時,先調用$mysqli->begin_transaction()開啟事務,操作結束後調用$mysqli->commit()提交,失敗則調用$mysqli->rollback()回滾。

  • 使用mysqli_stmt預處理語句執行插入,避免SQL 注入風險。

  • 插入成功後,通過$stmt->insert_id獲取本次插入的自增ID,確保准確無誤。

  • 異常處理中一定要回滾事務,保證數據的一致性和完整性。


5. 兼容性說明

mysqli_stmt::$insert_id僅在PHP 8.1 及以上版本可用。如果使用的是舊版本PHP,可以考慮用$mysqli->insert_id ,但要注意並發問題。