PDO将最后一个插入ID插入两个表

Posted

技术标签:

【中文标题】PDO将最后一个插入ID插入两个表【英文标题】:PDO inserting last insert id into two tables 【发布时间】:2017-12-15 17:14:20 【问题描述】:

我正在尝试将相同的 insertId 插入到几个链接表中,但是我发现在执行第一种方法后显然插入 id 被重置为零。这些方法是分开的,因为它们在其他地方被重用。它们在不同的类中。

实际上调用了三个进程,但我主要关心这两个更新,其中一个取消另一个。

if($resource->createResource())

    $author->resourceAuthor();
    $subject->resourceSubject();


这两种方法本质上是相同的。每个都将数据插入一个单独的链接表(多对多)。

第一个是这样的:

function resourceAuthor()


    $query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";

    $last_id = $this->conn->lastInsertId();

    $stmt = $this->conn->prepare($query);


    if(!empty($this->id)) 
        foreach($_POST['author_id'] as $id) 


            $stmt->execute(array(
                $last_id,
                $id
            ));
        
    

第二个是这样的:

function resourceSubject()


    $query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";

    $last_id = $this->conn->lastInsertId();

    $stmt = $this->conn->prepare($query);


    if(!empty($this->id)) 
        foreach($_POST['subject_id'] as $id) 


            $stmt->execute(array(
                $last_id,
                $id
            ));
        
    

无论我先运行哪一个,都可以正常工作,但第二个只是将 resource_id 输入为 0(其他行,即各自表中的 author_id 或 subject_id 正常,但当然它们最终会出现重复的键,当然 0 不是主键,至少在这种情况下)

有没有解决这个问题的简单方法?我已经尝试在初始脚本中将插入 id 创建为变量,它似乎没有效果。

编辑

我尝试过这样的事情:

if($resource->createResource())

    $last_id = $db->lastInsertId();
    print_r($last_id);
    $resource->resourceSubjectAuthor($last_id);



然后创建一个新方法

function resourceSubjectAuthor($last_id)


    $query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";


    $stmt = $this->conn->prepare($query);


    $query2 = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";


    $stmt2 = $this->conn->prepare($query2);
    if(!empty($this->id)) 
        foreach($_POST['author_id'] as $id) 


            $stmt->execute(array(
                $last_id,
                $id
            ));
        

        foreach($_POST['subject_id'] as $ids) 


            $stmt2->execute(array(
                $last_id,
                $ids
            ));
        
           



最后一个 id 被正确创建,但没有执行任何操作

【问题讨论】:

How to create a Minimal, Complete, and Verifiable example for a PDO related problem @YourCommonSense 感谢您的尝试,但这对我没有多大帮助;我有一个关于如何在两种方法中保留插入 id 的具体问题。我已尝试调试此问题并试图找到答案,但是您可以提供的任何帮助都会非常有帮助 哦,不。不是我试图提供帮助。这是必须做的事情来帮助自己,以便让您的问题保持开放。否则它将作为题外话关闭。 您的第一次尝试失败的原因很愚蠢,因为我从另一个插入中获取了插入。为什么你的第二次尝试失败了,没人知道 谢谢,我明白为什么第一个失败了。我只是想弄清楚如何让 id 从原始版本中传递出去。目前正在尝试使用事务(这似乎在官方网站上建议)使用相同的 id 并在执行之前调用它,但我不确定这是否是正确的方法。如果我解决它,我会在这里发布答案。 【参考方案1】:

好的,我设法解决了这个问题。该问题与一次执行后重置的插入 ID 直接相关。我只需要在调用这两个方法之前定义插入 id,然后在它们执行之前将该变量传递给方法。

if($resource->createResource())

    $last_id = $db->lastInsertId();
    $author->resourceAuthor($last_id);
    $subject->resourceSubject($last_id);

然后在这两种方法中,只传递变量而不是像这样声明它:

function resourceSubject($last_id)


    $query = "INSERT INTO resource_has_subjects (resource_id, subject_id) VALUES (?,?)";


    $stmt = $this->conn->prepare($query);


    if(!empty($this->id)) 
        foreach($_POST['subject_id'] as $id) 


            $stmt->execute(array(
                $last_id,
                $id
            ));
        
    

同样:

function resourceAuthor($last_id)


    $query = "INSERT INTO authors_has_resource (resource_id, author_id) VALUES (?,?)";
    $stmt = $this->conn->prepare($query);


    if(!empty($this->id)) 
        foreach($_POST['author_id'] as $id) 


            $stmt->execute(array(
                $last_id,
                $id
            ));
        
    

【讨论】:

以上是关于PDO将最后一个插入ID插入两个表的主要内容,如果未能解决你的问题,请参考以下文章

PDO 最后插入 id 返回 0

使用 PDO 准备好插入后获取最后一个插入 ID

如果需要,插入更新 pdo mysql 查询并获取最后插入的 id

无法从 MySQL 获取最后插入的 ID

如何获取最后插入的ID,以及PDO列的名称?

在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?