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

#php #mysql #sql #database

#php #mysql #База данных #pdo

Вопрос:

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

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

 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()
 

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

Ответ №1:

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

Нравится:

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

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

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

Комментарии:

1. да, вы правы, я нашел его, и он работает, спасибо, я приму ответ

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

3. @rybo111, hmm SELECT LAST_INSERT_ID() — это функция MySQL

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

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

Ответ №2:

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
 

Ответ №3:

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

Например, $lid = $conn-> lastInsertId();

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

Комментарии:

1. Добро пожаловать в Stack Overflow. Мы ценим полезный вклад, но, пожалуйста, не дублируйте существующие ответы.