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?

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.