Php execute是否中断PDO事务?

Php execute是否中断PDO事务?,php,mysql,pdo,Php,Mysql,Pdo,我正在将用户输入写入2个MySQL表,如下所示: (a) 在表a中插入一些数据 (b) 获取最后插入的ID (c) 将其他数据插入表B 我有: $this->conn->beginTransaction(); $stmt = $this->conn->prepare(" INSERT INTO requests ($creation_da

我正在将用户输入写入2个MySQL表,如下所示:

(a) 在表a中插入一些数据

(b) 获取最后插入的ID

(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();
在这一点上,我最终需要的是得到最后一个insertid, 但它似乎只有在第一次
$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()在事务代码的中间以某种方式中断事务。我的理解是,它不应该——但到目前为止,还没有找到任何好的证据证明这一点

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

  • 谢谢你的建议

    execute是否会中断PDO事务

    没有

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

    希望现在一切都清楚了

    execute是否会中断PDO事务

    没有

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


    希望现在一切都清楚了。

    $stmt->execute(['requests\u id'=>$lastInsertId])。不过,你在帖子中没有提出任何问题。没有什么可回答的。它不应该回答,事务只有在回滚或提交时才会中断,提交使您对数据库的更改永久化,而回滚使您的数据库状态恢复到开始事务之前的状态。@mendez7如果发生错误,它也会“中断”。看起来不像“代码太多”对我来说。就我个人而言,我会将SQL文本的生成分离成单独的代码行和变量,然后将该变量传递到
    prepare
    。这为我提供了一个方便的调试点,记录(或发出)生成的SQL文本。就个人而言,我会使用
    bindValue
    代替
    bindParam
    。我将假设
    $creation\u date
    可以保证安全地包含在SQL文本中,并且我们不开放SQL注入。大家好,感谢大家的想法和评论,有了这些想法真的很有用@spencer7593将sql查询与$sql var分开,我肯定会这样做。谢谢<代码>$stmt->execute(['requests\u id'=>$lastInsertId])。不过,你在帖子中没有提出任何问题。没有什么可回答的。它不应该回答,事务只有在回滚或提交时才会中断,提交使您对数据库的更改永久化,而回滚使您的数据库状态恢复到开始事务之前的状态。@mendez7如果发生错误,它也会“中断”。看起来不像“代码太多”对我来说。就我个人而言,我会将SQL文本的生成分离成单独的代码行和变量,然后将该变量传递到
    prepare
    。这为我提供了一个方便的调试点,记录(或发出)生成的SQL文本。就个人而言,我会使用
    bindValue
    代替
    bindParam
    。我将假设
    $creation\u date
    可以保证安全地包含在SQL文本中,并且我们不开放SQL注入。大家好,感谢大家的想法和评论,有了这些想法真的很有用@spencer7593将sql查询与$sql var分开,我肯定会这样做。谢谢