PDO получить последний вставленный идентификатор


158

У меня есть запрос, и я хочу вставить последний идентификатор. Идентификатор поля - это первичный ключ и автоинкремент.

Я знаю, что я должен использовать это утверждение:

LAST_INSERT_ID()

Это утверждение работает с запросом, подобным этому:

$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())";

Но если я хочу получить идентификатор с помощью этого заявления:

$ID = LAST_INSERT_ID();

Я получаю эту ошибку:

Fatal error: Call to undefined function LAST_INSERT_ID()

Что я делаю не так?

Ответы:


367

Это потому, что это функция SQL, а не PHP. Вы можете использовать PDO::lastInsertId().

Подобно:

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();

Если вы хотите сделать это с помощью SQL вместо API PDO, вы должны сделать это как обычный запрос выбора:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();

1
да, вы правы, я нашел это, и это работает, спасибо, я приму ответ
Уильям Кинаан

7
@ rybo111, сначала это Screaming snake case. во-вторых, это соглашение об именах MySQL, а не PHP
azerafati

2
@ rybo111, хмм SELECT LAST_INSERT_ID()это функция MySQL
azerafati

32
Так что, возможно, это глупый вопрос для продолжения, но я просто хочу быть уверенным. Когда я полагаюсь на lastInsertId (), он возвращает последний вставленный идентификатор, который произошел в моем текущем исполняемом коде, прямо сейчас? Или он возвращает последний вставленный идентификатор из моей базы данных? Например, если у меня есть сайт с интенсивным трафиком, и я вставляю что-то во время сценария входа в систему и использую lastInsertId () для получения вставленного идентификатора, но многие люди одновременно входят в систему, могу ли я положиться на lastInsertId ( ) чтобы получить последний вставленный идентификатор из этого конкретного экземпляра исполняемого кода? Или я
рискну

41
@ArtGeigel Это будет последний вставленный идентификатор соединения, лежащего в основе экземпляра PDO. Другими словами, это безопасно в описанном вами сценарии, поскольку параллельные запросы будут выполняться в отдельных соединениях.
Корбин

15

lastInsertId () работает только после запроса INSERT.

Верный:

$stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass) 
                              VALUES(?,?,?);");
$sonuc = $stmt->execute([$username,$email,$pass]);
$LAST_ID = $this->conn->lastInsertId();

Неправильно:

$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0

-5

Вы можете получить идентификатор последней транзакции, запустив метод lastInsertId () для объекта подключения ($ conn).

Вот так: $ lid = $ conn-> lastInsertId ();

Пожалуйста, ознакомьтесь с документами https://www.php.net/manual/en/language.oop5.basic.php


2
Добро пожаловать в переполнение стека. Мы ценим полезный вклад, но, пожалуйста, не дублируйте существующие ответы.
Ваш здравый смысл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.