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. по-друге, це умовна
умова

2
@ rybo111, hmm 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.