首页 > 解决方案 > 如何在事务中运行多个 INSERT 查询并使用插入 ID?

问题描述

我需要将数据插入到 3 个表中,并且需要将最后插入的查询的 id 放入shopper表中。我知道这可以通过运行

$conn -> insert_id;

在单个查询中,但在我的情况下,我需要创建一个带有回滚的事务,以防出现任何故障。就像是

$conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);

$stmt1 = $conn->prepare("INSERT INTO shopper (usersID, parentJob, phoneNumber,address) VALUES (?, ?, ?, ?)");
$stmt1->bind_param("ssss", $userId, $parentJob, $phoneB, $addressB);

$stmt2 = $conn->prepare("INSERT INTO shipment (shipmentID, usersID,..) VALUES (?, ?, ?, ?)");
$stmt2->bind_param("ssss", $userId, ...);

$stmt3 = $conn->prepare("INSERT INTO address (addressID, usersID, ...) VALUES (?, ?, ?, ?)");
$stmt3->bind_param("ss", $userId, ...);

$conn->begin_transaction();
if ($stmt1->execute() && $stmt2->execute() && $stmt3->execute()) {
    $conn->commit();
} else {
    $conn->rollback();
}

$conn->close();

如您所见,我试图将最后插入usersID的外键作为外键传递到shipmentaddress中。所以当我把它们全部一起提交时我怎么能做到这一点

if ($stmt1->execute() && $stmt2->execute() && $stmt3->execute()) {
    $conn->commit();
} else {
    $conn->rollback();
}

标签: phpmysqlimysql-insert-id

解决方案


异常为交易提供了巨大的帮助。因此配置 mysqli 以抛出异常。不仅适用于交易,而且因为它通常是报告错误的唯一正确方法。

除了例外,您的代码将简单明了

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
$conn->set_charset('utf8mb4');

$conn->begin_transaction();

$stmt = $conn->prepare("INSERT INTO shopper (usersID, parentJob, phoneNumber,address) VALUES (null, ?, ?, ?)");
$stmt->bind_param("sss", $parentJob, $phoneB, $addressB);
$stmt->execute();
$userId = $conn->insert_id;

$stmt = $conn->prepare("INSERT INTO shipment (shipmentID, usersID,..) VALUES (?, ?, ?, ?)");
$stmt->bind_param("ssss", $userId, ...);
$stmt->execute();

$stmt = $conn->prepare("INSERT INTO address (addressID, usersID, ...) VALUES (?, ?, ?, ?)");
$stmt->bind_param("ss", $userId, ...);
$stmt->execute();

$conn->commit();

如果发生错误,将抛出异常并自动回滚事务。


推荐阅读