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