execute会破坏PDO事务吗?

时间:2017-12-12 00:27:18

标签: php mysql pdo

我正在将用户输入写入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();

问题:

  1. 我担心事务代码中间的第一个$stmt->execute();会以某种方式中断事务。我的理解是它不应该 - 但到目前为止还没有找到任何好的证据。

  2. 我正在寻找更优雅的解决方案,因为目前似乎有太多代码用于简单的任务。

  3. 感谢您的任何建议

1 个答案:

答案 0 :(得分:2)

  

execute会破坏PDO事务吗?

没有

execute()是执行查询。如果没有execute(),您的查询将无法执行。如果没有执行查询,则数据库中不会存储任何信息。没有存储在数据库中的信息,任何事务都没有意义。因此,要进行事务,必须在数据库中存储数据。要在数据库中存储数据,您必须执行查询。要执行查询,您必须调用execute()。

希望现在一切都清楚。