php - 如何在事务中运行多个 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
的外键作为外键传递到shipment
表address
中。所以当我把它们全部一起提交时我怎么能做到这一点
if ($stmt1->execute() && $stmt2->execute() && $stmt3->execute()) {
$conn->commit();
} else {
$conn->rollback();
}
解决方案
异常为交易提供了巨大的帮助。因此配置 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();
如果发生错误,将抛出异常并自动回滚事务。
推荐阅读
- django - 在 Django 中对聚合进行分组
- c++ - cout 我的动态数组时得到垃圾值
- javascript - 有什么方法可以隐藏沉浸式 VR 立体视图?我只想用这个vr的空间追踪功能
- javascript - 在不知道原始大小的情况下 React Native Redux Animate 视图高度
- java - 线程中抛出 JUnit5 检查异常
- node.js - NodeJS 将 shell exec 的输出捕获到 const
- python - BeautifulSoup 找不到
- oracle - 从部署在 Windows 中的 Spring Boot 应用程序上传 aix 服务器中的文件
- regex - PCRE Nginx 正则表达式匹配任何单词或以后缀结尾
- types - OCAML:具有多种类型的参数