Вопрос по php, mysql, database – PDO получить последний вставленный идентификатор

131

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

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

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

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

Ваш Ответ

2   ответа
286

PDO::lastInsertId().

Подобно

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

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

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
@ ArtGeigel Это будет последний вставленный идентификатор соединения, лежащего в основе экземпляра PDO. Другими словами, это безопасно в описанном вами сценарии, поскольку параллельные запросы будут выполняться в отдельных соединениях. Corbin
да, ты прав, я нашел это, и это работает, спасибо, я приму ответ William Kinaan
@ rybo111, сначала этоScreaming snake case. во-вторых, это соглашение об именах MySQL, а не PHP azerafati
@ rybo111, хмSELECT LAST_INSERT_ID() является функцией MySQL azerafati
Так что, возможно, это глупый вопрос, но я просто хочу быть уверенным. Когда я полагаюсь на lastInsertId (), он возвращает последний вставленный идентификатор, который произошел в моем текущем исполняемом коде, прямо сейчас? Или он возвращает последний вставленный идентификатор из моей базы данных? Например, если у меня есть сайт с интенсивным трафиком, и я вставляю что-то во время сценария входа в систему и использую lastInsertId () для получения вставленного идентификатора, но многие люди одновременно входят в систему, могу ли я положиться на lastInsertId ( ) чтобы получить последний вставленный идентификатор из этого конкретного экземпляра исполняемого кода? Или я рискую Art Geigel
6

Правильный

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

Incorrect:

$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0
Плохой пример, переменные не имеют места в запросах. Используйте подготовленные заявления: Php.net / ручной / EN / pdo.prepared-statements.php Wouter van Eekelen

Похожие вопросы