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
Добро пожаловать в переполнение стека. Мы ценим полезный вклад, но, пожалуйста, не дублируйте существующие ответы.
Ваш здравый смысл