PDO вставляет последний идентификатор вставки в две таблицы

0

Я пытаюсь вставить тот же insertId в пару таблиц ссылок, однако я обнаружил, что, по-видимому, идентификатор вставки возвращается к нулю после выполнения первого метода. Эти методы являются раздельными, поскольку они используются повторно в других местах. Они находятся в отдельных классах.

Существует по существу три процесса, которые вызываются, но в основном я занимаюсь этими двумя обновлениями, один из которых отменяет другой.

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
            ));
        }
    }       


}

Последний идентификатор создается правильно, но затем ничего не выполняется

Теги:
pdo
last-insert-id

1 ответ

1
Лучший ответ

Хорошо, мне удалось это решить. Проблема была напрямую связана с сбросом идентификатора вставки после одного выполнения. Мне просто нужно было определить 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
            ));
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню