O PDO obtém o último ID inserido

158

Tenho uma consulta e quero inserir o último ID. O ID do campo é a chave primária e o incremento automático.

Eu sei que tenho que usar esta declaração:

LAST_INSERT_ID()

Essa declaração funciona com uma consulta como esta:

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

Mas se eu quiser obter o ID usando esta declaração:

$ID = LAST_INSERT_ID();

Eu recebo este erro:

Fatal error: Call to undefined function LAST_INSERT_ID()

O que estou fazendo de errado?

William Kinaan
fonte

Respostas:

367

Isso porque é uma função SQL, não PHP. Você pode usar PDO::lastInsertId().

Gostar:

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

Se você quiser fazer isso com SQL em vez da API do PDO, faça como uma consulta de seleção normal:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
Corbin
fonte
1
sim você mesmo, eu achei e ele funciona, obrigado, eu vou aceitar a resposta
William Kinaan
7
@ Rybo111, primeiro é Screaming snake case. segundo, é MySQL convenção de nomeação e não é PHP
azerafati
2
@ rybo111, hmm SELECT LAST_INSERT_ID()é uma função MySQL
azerafati
32
Talvez essa seja uma pergunta idiota de acompanhamento, mas eu só quero ter certeza. Quando eu confio no lastInsertId (), ele retorna o último ID inserido que ocorreu no meu código atualmente em execução? Ou ele retorna o último ID inserido do meu banco de dados? Por exemplo, se eu tenho um site com tráfego intenso e insiro algo durante o script de login e uso lastInsertId () para obter o iD inserido, mas muitas pessoas estão fazendo login ao mesmo tempo, posso confiar no lastInsertId ( ) para obter o último ID inserido dessa instância específica de execução de código? Ou corro um risco
Art Geigel 18/11/2015
41
@ArtGeigel Será o último ID inserido da conexão subjacente à instância do PDO. Em outras palavras, é seguro no cenário que você descreveu, pois as consultas simultâneas ocorreriam em conexões separadas.
Corbin
15

lastInsertId () funciona apenas após a consulta INSERT.

Corrigir:

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

Incorreta:

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

Você pode obter o ID da última transação executando o método lastInsertId () no objeto de conexão ($ conn).

Assim $ lid = $ conn-> lastInsertId ();

Confira os documentos https://www.php.net/manual/en/language.oop5.basic.php

Kanton Samad
fonte
2
Bem-vindo ao Stack Overflow. Valorizamos contribuições úteis, mas não duplique as respostas existentes.
Seu senso comum