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

时间:2017-12-15 17:14:20

标签: php mysql pdo last-insert-id

我试图将相同的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,但没有任何内容被执行

1 个答案:

答案 0 :(得分: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
            ));
        }
    }
}