Como Obter o Último ID Inserido em PHP e MySQL
Aprenda a recuperar o último ID inserido em PHP e MySQL usando MySQLi e PDO, com exemplos práticos e dicas importantes de segurança.
Quando você insere uma linha em uma tabela MySQL cuja chave primária é uma coluna AUTO_INCREMENT, o banco de dados gera o novo ID automaticamente. O PHP oferece uma maneira de ler esse ID imediatamente após a inserção, sem precisar executar uma segunda consulta SELECT. Esta página mostra como fazer isso com as extensões MySQLi e PDO, por que o valor é confiável e os erros comuns a evitar.
O último ID inserido é usado com mais frequência para vincular registros relacionados: inserir um novo user, obter seu ID e, em seguida, inserir linhas em orders ou profiles que o referenciam como chave estrangeira.
Como funciona
Ambas as funções descritas abaixo retornam o ID gerado pelo INSERT bem-sucedido mais recente na conexão atual com o banco de dados:
mysqli_insert_id($conn)— MySQLi (procedural ou orientado a objetos).PDO::lastInsertId()— PDO.
Dois detalhes importantes:
- O valor é por conexão. Mesmo que outros usuários insiram linhas ao mesmo tempo, você sempre obtém o ID gerado pela sua conexão, portanto não há condição de corrida.
- Ele só retorna um valor diferente de zero quando a tabela inserida tem uma coluna
AUTO_INCREMENT. Se a tabela não tiver chave de incremento automático, você obtém0.
Pré-requisitos
Antes de começar, há alguns pré-requisitos que você deve ter:
- Um servidor web com PHP instalado
- Um banco de dados MySQL
- Acesso à interface phpMyAdmin ou ferramenta similar de gerenciamento de banco de dados
- Uma tabela com chave primária
AUTO_INCREMENT. Os exemplos abaixo assumem esta:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);Consulte Criar uma Tabela MySQL para saber mais sobre como definir tabelas.
Estabelecendo uma Conexão
O primeiro passo para recuperar o último ID inserido é estabelecer uma conexão com o banco de dados. Com MySQLi isso é feito usando a função mysqli_connect(), que requer os seguintes parâmetros:
- O nome do servidor de banco de dados
- O nome de usuário usado para acessar o banco de dados
- A senha do usuário do banco de dados
- O nome do banco de dados ao qual se conectar
Aqui está um exemplo de como estabelecer uma conexão com um banco de dados:
<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";
$conn = mysqli_connect($server, $username, $password, $database);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>Para uma visão mais aprofundada sobre conexão, consulte Conectar a um Banco de Dados MySQL.
Escrevendo a Instrução SQL
Depois que uma conexão com o banco de dados for estabelecida, o próximo passo é escrever a instrução SQL que será usada para inserir os dados no banco de dados.
Aqui está um exemplo de instrução SQL que insere dados em uma tabela do banco de dados:
INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');Executando a Instrução SQL
Depois que a instrução SQL for escrita, o próximo passo é executá-la. Isso é feito usando a função mysqli_query(), que requer os seguintes parâmetros:
- A conexão com o banco de dados
- A instrução SQL a ser executada
Aqui está um exemplo de como executar a instrução SQL:
<?php
$sql = "INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
?>Nota de Segurança: Em ambientes de produção, sempre use prepared statements para prevenir ataques de SQL injection.
Recuperando o Último ID Inserido
Depois que os dados forem inseridos no banco de dados, o próximo passo é recuperar o ID do último registro inserido. Isso é feito usando a função mysqli_insert_id(), que requer o seguinte parâmetro:
- A conexão com o banco de dados
Aqui está um exemplo de como recuperar o último ID inserido:
<?php
$last_id = mysqli_insert_id($conn);
echo "Last inserted ID is: " . $last_id;
?>Fechando a Conexão
Depois que o último ID inserido for recuperado, é importante fechar a conexão com o banco de dados para evitar riscos de segurança. Isso é feito usando a função mysqli_close(), que requer o seguinte parâmetro:
- A conexão com o banco de dados
Aqui está um exemplo de como fechar a conexão com o banco de dados:
<?php
mysqli_close($conn);
?>Exemplo completo (MySQLi, prepared statement)
No código real, você deve passar dados do usuário através de um prepared statement em vez de concatená-los na string SQL. O padrão é idêntico: execute a inserção e, em seguida, leia o ID. Aqui tudo está reunido:
<?php
$conn = mysqli_connect("localhost", "root", "password", "database_name");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$stmt = mysqli_prepare($conn, "INSERT INTO users (name, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $name, $email);
$name = "Jane Doe";
$email = "[email protected]";
mysqli_stmt_execute($stmt);
$last_id = mysqli_insert_id($conn);
echo "New user inserted with ID: " . $last_id;
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>Após a inserção ser bem-sucedida, $last_id contém o valor que o MySQL gerou para a coluna id — por exemplo 1 na primeira inserção, 2 na próxima e assim por diante.
Obtendo o último ID com PDO
Se você se conectar com PDO em vez de MySQLi, use o método lastInsertId() no objeto de conexão:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "root", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(["John Doe", "[email protected]"]);
$last_id = $pdo->lastInsertId();
echo "New user inserted with ID: " . $last_id;
?>Note que PDO::lastInsertId() retorna o ID como uma string, portanto use cast com (int) se precisar de um tipo numérico.
Erros comuns
- Chame logo após a inserção. Execute
mysqli_insert_id()/lastInsertId()antes de executar qualquer outra consulta na mesma conexão — umINSERTposterior substitui o valor armazenado. - Sem coluna auto-increment →
0. A função retorna0(não um erro) quando a tabela na qual você inseriu não tem colunaAUTO_INCREMENT. UPDATEeDELETEnão alteram o valor. Apenas instruçõesINSERTque criam um valor de incremento automático atualizam o resultado.- Não use
SELECT MAX(id). Um erro comum é ler o ID mais alto comSELECT MAX(id) FROM users. Em inserções simultâneas, isso pode retornar a linha de outro usuário. As funções dedicadas têm escopo de conexão e são seguras.
Conclusão
Neste artigo, mostramos como recuperar o último ID inserido em PHP e MySQL. Seguindo esses passos, você deverá ser capaz de recuperar o ID do último registro inserido em seu banco de dados. Para melhores resultados, sempre insira dados através de prepared statements e leia o ID na mesma conexão imediatamente após a inserção.
Capítulos relacionados: Inserir Dados no MySQL, Prepared Statements e Selecionar Dados do MySQL.