mysqli->insert_id при обновлении (PHP)

У кого-нибудь это работает?:П

Я могу правильно получить insert_id при вставке, но не при обновлении. Конечно, столбец contactsId имеет значение AUTO_INCREMENT.

Весь код:

<?php
$mysqli = new mysqli('localhost', [USER], [PASSWORD], [DB]);
$mysqli->set_charset("utf8");

$query = 'INSERT INTO contacts (contactsName) VALUES ("Mariola")';
$result = $mysqli->query($query);
echo $mysqli->insert_id . '<br />';

$query = 'UPDATE contacts SET contactsName = "Mariola" WHERE contactsId = 289';
$result = $mysqli->query($query);
echo $mysqli->insert_id;

Выход:

1514
0

У меня есть запись с идентификатором 289, и обновление работает нормально.

2 ответа

Решение

Из документации MySQL по LAST_INSERT_ID():


Если expr дается в качестве аргумента LAST_INSERT_ID() значение аргумента возвращается функцией и запоминается как следующее значение, возвращаемое LAST_INSERT_ID(), Это может быть использовано для симуляции последовательностей:

Создайте таблицу для хранения счетчика последовательности и инициализируйте его:

mysql> CREATE TABLE sequence (id INT NOT NULL);
mysql> INSERT INTO sequence VALUES (0);

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

mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();

UPDATE инструкция увеличивает счетчик последовательности и вызывает следующий вызов LAST_INSERT_ID() вернуть обновленное значение. SELECT оператор извлекает это значение. mysql_insert_id() Функция API C также может быть использована для получения значения. См. Раздел 20.6.7.37, " mysql_insert_id() ".


Может быть, что-то вроде этого будет работать:

$query = 'UPDATE contacts SET id = LAST_INSERT_ID(id), contactsName = "Mariola" WHERE contactsId = 289';

Это поведение очень четко описано в документе.

mysqli:: $ insert_id - mysqli_insert_id - возвращает автоматически сгенерированный идентификатор, использованный в последнем запросе

Если последний запрос не был оператором INSERT или UPDATE или измененная таблица не имеет столбца с атрибутом AUTO_INCREMENT, эта функция вернет ноль.

Другие вопросы по тегам