我正在将用户输入写入2个MySQL表,如下所示:
(a)将一些数据插入表A,
(b)获取lastInsertId,
(c)将其他数据插入表B。
我有:
$this->conn->beginTransaction();
$stmt = $this->conn->prepare("
INSERT INTO requests
($creation_date, etc...) // some data
VALUES(:creation_date, etc..);"); // some values
$stmt->bindparam(":creation_date",$creation_date);
...
$stmt->execute();
此时,我最终需要的是获取lastInsertId,
但它似乎只在第一个$stmt->execute()
之后才可用,否则它会返回0,因为交易中的特定操作尚未实际开始(请另外确认)。
进一步编码如下:
$lastInsertId = $this->conn->lastInsertId();
$stmt = $this->conn->prepare("
INSERT INTO other_requests
(requests_id,...) // some more data
VALUES(:requests_id,...);"); // some more values
$stmt->bindparam(":requests_id", $lastInsertId);
$stmt->bindparam(...); // some more bindings
$stmt->execute();
$this->conn->commit();
问题:
我担心事务代码中间的第一个$stmt->execute();
会以某种方式中断事务。我的理解是它不应该 - 但到目前为止还没有找到任何好的证据。
我正在寻找更优雅的解决方案,因为目前似乎有太多代码用于简单的任务。
感谢您的任何建议
答案 0 :(得分:2)
execute会破坏PDO事务吗?
没有
execute()是执行查询。如果没有execute(),您的查询将无法执行。如果没有执行查询,则数据库中不会存储任何信息。没有存储在数据库中的信息,任何事务都没有意义。因此,要进行事务,必须在数据库中存储数据。要在数据库中存储数据,您必须执行查询。要执行查询,您必须调用execute()。
希望现在一切都清楚。