Копировать строку Получить последнюю вставку ID

Я копирую строку в одну из таблиц в моей базе данных и пытаюсь получить последний вставленный идентификатор. Копирование строки работает нормально, и поле AI обновляется должным образом, но оно не возвращает идентификатор последней вставки (хотя оно возвращает true — или, если я подставляю что-то еще на его место, которое также отлично работает).

Некоторые другие запросы также используют последний идентификатор вставки, и они работают хорошо.

Я подозреваю, что это как-то связано с временной таблицей, но не могу найти что-либо на SO о подобной проблеме с последним идентификатором вставки и временными таблицами. Кто-нибудь знает, что является причиной проблемы или есть ли обходной путь?

public function duplicateItinRow($itineraryID){
$this->db->query("CREATE TEMPORARY TABLE temporary_itin_table AS SELECT * FROM itinerary_ref WHERE Itinerary_ID = $itineraryID;

UPDATE temporary_itin_table SET Itinerary_ID=NULL;

INSERT INTO itinerary_ref SELECT * FROM temporary_itin_table;

DROP TEMPORARY TABLE temporary_itin_table");

//Execute
if($this->db->execute()){
return $this->db->lastInsertId();

} else {
return false;
}


}

ОБНОВИТЬ:

Я уверен, что это не идеальное решение, но оно работает, используя метод копирования, подробно описанный здесь: Как скопировать строку и вставить в ту же таблицу с автоинкрементным полем в MySQL?

1

Решение

Я думаю, что lastInsertedId будет обновлен вашим последним оператором «DROP TEMPORARY TABLE».

Попробуйте вместо этого разделить запрос на два отдельных запроса:

<?php

public function duplicateItinRow($itineraryID) {
$this->db->query("CREATE TEMPORARY TABLE temporary_itin_table AS SELECT * FROM itinerary_ref WHERE Itinerary_ID = $itineraryID;

UPDATE temporary_itin_table SET Itinerary_ID=NULL;

INSERT INTO itinerary_ref SELECT * FROM temporary_itin_table;");


if(!$this->db->execute()) {
return false;
}

$lastId = $this->db->lastInsertId();
$this->db->query("DROP TEMPORARY TABLE temporary_itin_table");

if(!$this->db->execute()) {
return false;
}

return $lastId;
}

Также обратите внимание, что у вас есть уязвимость SQL-инъекция при добавлении $itineraryID непосредственно к SQL-запросу без использования подготовленных операторов. Если $itineraryID заполнен из пользовательского ввода люди могут взломать ваш сайт.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]