Я копирую строку в одну из таблиц в моей базе данных и пытаюсь получить последний вставленный идентификатор. Копирование строки работает нормально, и поле 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?
Я думаю, что 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
заполнен из пользовательского ввода люди могут взломать ваш сайт.
Других решений пока нет …