Como obtenho o último ID inserido de uma tabela MySQL no PHP?

93

Eu tenho uma tabela na qual novos dados são freqüentemente inseridos. Preciso obter a última identificação da tabela. Como posso fazer isso?

É semelhante a SELECT MAX(id) FROM table?

gweg
fonte
1
sim, você esta consulta retornará o último id da tabela. Mas uma condição é que o ID deve ser uma chave primária. Portanto, você pode evitar o arrependimento.
sathish
7
@sathish: O principal problema desse método é a simultaneidade .
CMS
3
Para elaborar: O problema com isso é que se alguém inserir algo na tabela entre o seu INSERTe a consulta por MAX(id), você pode obter um id que não é o seu último id.
deceze
3
@Jocelyn essa pergunta foi feita um ano depois com milhares de visualizações a menos do que esta pergunta.
Naftali também conhecido como Neal
3
@Neal, você está certo. A outra questão deve ser encerrada como duplicado desta.
Jocelyn

Respostas:

133

Se você estiver usando PDO, use PDO::lastInsertId.

Se você estiver usando o Mysqli, use mysqli::$insert_id.

Se você ainda estiver usando o Mysql:

Por favor, não use mysql_*funções no novo código . Eles não são mais mantidos e estão oficialmente obsoletos . Veja a caixa vermelha ? Emvez disso,aprenda sobre as instruções preparadas e use PDO ou MySQLi - este artigo o ajudará a decidir quais. Se você escolher PDO, aqui está um bom tutorial .

Mas se for preciso, use mysql_insert_id.

deceze
fonte
O problema com este é se você tiver muitas inserções acontecendo (por exemplo, seu banco de dados também registra algo), você pode obter o ID errado.
Mike
@Mike Não se você usar mysql_insert_id logo após seu mysql_query. Se é claro que você executa várias outras consultas na mesma conexão, bem, não há nada que possa ajudá-lo nisso.
deceze
7
Para garantir que você NUNCA obterá um id errado, envolva seu código com uma TRANSAÇÃO .
Marcelo Assis
28
O mysql garante que este seja o último id DA CONEXÃO ATUAL, então não haverá problemas se você colocar esta instrução logo após a consulta de inserção. Não se preocupe com outros processos fazendo inserções. Não há necessidade de envolver isso em uma transação. O manual do mysql diz: "O ID que foi gerado é mantido no servidor por conexão. Isso significa que o valor retornado pela função para um determinado cliente é o primeiro valor AUTO_INCREMENT gerado para a instrução mais recente afetando uma coluna AUTO_INCREMENT por esse cliente . Este é o motivo pelo qual você não deve usar select MAX (ID)
woens,
1
@deceze, o que há com esse PDOpreconceito que vemos em todos os lugares? Vejamos a comparação de recursos novamente. É claro que mysqlié o vencedor quando você precisa sujar as mãos com coisas de baixo nível. Em outras palavras, mesmo se alguém escolher o PDO, ele eventualmente precisará usar de mysqliqualquer maneira.
Pacerier
53

existe uma função para saber qual foi o último id inserido na conexão atual

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

Além disso, usar o max é uma má ideia porque pode levar a problemas se o seu código for usado ao mesmo tempo em duas sessões diferentes.

Essa função é chamada mysql_insert_id

RageZ
fonte
2
mysql _ (...) está obsoleto na versão PHP> = 5.5.
Iago,
Sim, estou apenas me lembrando disso. :)
Iago
22

Está certo. Você também pode usar LAST_INSERT_ID ()

x2.
fonte
1
Por que você diz que select max(id)from tableestá tudo bem?
Pacerier
18

Com PDO :

$pdo->lastInsertId();

Com Mysqli :

$mysqli->insert_id;

Por favor, não use mysql_*funções no novo código . Eles não são mais mantidos e estão oficialmente obsoletos . Veja a caixa vermelha ? Emvez disso,aprenda sobre as instruções preparadas e use PDO ou MySQLi - este artigo o ajudará a decidir quais. Se você escolher PDO, aqui está um bom tutorial .

Naftali também conhecido como Neal
fonte
8

O que você escreveu lhe daria o melhor, idsupondo que eles fossem únicos e com incremento automático, o que seria ótimo supondo que você não tem problema em convidar problemas de concorrência.
Como você está usando o MySQL como banco de dados, existe a função específica LAST_INSERT_ID()que só funciona na conexão atual que fez a inserção.
PHP oferece uma função específica para isso também chamada mysql_insert_id.

dlamblin
fonte
6

Tente isso deve funcionar bem:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);
Sandhu
fonte
1
Obrigado por notar. Eu editei o código, na verdade é $ link (variável que mantém a conexão)
Sandhu
3

Você pode obter a última id inserida pela função interna de php mysql_insert_id();

$id = mysql_insert_id();

você também pode obter a última id por

$id = last_insert_id();
Rahul
fonte
4
Além disso, isso está errado porque sugere o uso de uma biblioteca obsoleta. Sério, exclua isso
STT LCU
@STTLCU Qual snippet aqui está obsoleto?
TheBlackBenzKid
@TheBlackBenzKid ambos, porque são baseados nas funções mysql_ *
STT LCU
@Rahul $ id = last_insert_id (); não está funcionando, pois pode estar obsoleto.
Esha de
3

Para obter o último id inserido no codeigniter Após executar a consulta de inserção, basta usar uma função chamada insert_id()no banco de dados, ela retornará o último id inserido

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

em uma linha

echo $this->db->insert('mytable',$data)->insert_id();
Narsimha
fonte
3

Pode ser usado mysql_insert_id(), mas há uma observação específica sobre como usá-lo, você deve chamá-lo após a consulta INSERT executada, ou seja, na mesma sessão de script. Se você usá-lo de outra forma, ele não funcionará corretamente.

Mihail Dimitrov
fonte
2

Limpo e simples -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
Hitesh
fonte
1

NOTA: se você fizer múltiplas inserções com uma instrução mysqli :: insert_id não estará correto.

A mesa:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Agora se você fizer:

insert into xyz (name) values('one'),('two'),('three');

O mysqli :: insert_id será 1 e não 3.

Para obter o valor correto, faça:

mysqli::insert_id + mysqli::affected_rows) - 1

Este foi um documento, mas é um pouco obscuro.

Bartonlp
fonte
1

Eu prefiro usar uma sintaxe MySQL pura para obter a última id de auto_increment da tabela que desejo.

php mysql_insert_id () e mysql last_insert_id () fornecem apenas o ID da última transação.

Se você deseja o último ID auto_incremented de qualquer tabela em seu esquema (não apenas a última transação), você pode usar esta consulta

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

É isso aí.

Syjust
fonte
Tenho dúvidas sobre isso, já que esse SQL está simplesmente errado no contexto da questão ... Além disso, esse método parece sujeito a possíveis condições de corrida quando dois ou mais clientes executam esse SQL ao mesmo tempo ... Não tenho certeza a rapidez com que os dados desta coluna são atualizados após uma inserção que me deixa em dúvida ... As funções PHP que podem obter o último id são baseadas no nível de conexão / sessão (faz mais ou menos o mesmo que LAST_INSERT_ID () do MySQL ), o que torna a condição de corrida salva
Raymond Nijland
1

É triste não ver respostas com um exemplo.

Usando Mysqli :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Usando PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
Ferrugem
fonte
0

Usando MySQLitransaction eu às vezes não conseguia mysqli::$insert_id, porque retornava 0. Principalmente se eu estivesse usando stored procedures, que executam INSERTs. Portanto, há outra maneira dentro da transação:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>
BlitZ
fonte
0

Use mysqli porque mysql é depreciativo

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>
Poorna Rao
fonte
0

eu tentei

mysqli_insert_id ($ dbConnectionObj)

Isso retorna o último id inserido da conexão atual, portanto, se você estiver gerenciando suas conexões corretamente, isso deve funcionar. Funcionou para mim, pelo menos.

user2166373
fonte
0

Use o PDP e tente isso

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

$ lastid = mysql_insert_id ();

Treby
fonte
-1

Por toda essa discussão, presumo que a razão para verificar o id máximo é saber qual id deve ser o próximo. (Se meu id máximo for 5, o próximo será 5 + 1 = 6).

>> Se este não for o motivo, minhas melhores desculpas

Caso se outra pessoa inserir informações entre o seu CHECK e INSERT, você obterá um ID incorreto.

Portanto, pode ser resolvido se você criar um hash que possa incluir carimbo de data / hora ou outro valor exclusivo.

Então, na mesma função você pode inserir suas informações com valores vazios e seu hash. Isso criaria ID se você tiver AUTO_INCRECEMENT selecionado.

Então, na mesma função, você ainda teria seu hash e poderia procurar por id com o mesmo hash. E então você pode preencher os valores vazios com mysql UPDATE.

Isso inclui um pouco mais de conexões, mas ainda é uma maneira de fazer isso ...

Boa sorte para resolver isso.

Aurimas
fonte
-2

Se sua tabela tem coluna AUTO INCREMENT como UserID, Emp_ID, .. então você pode usar esta consulta para obter o último registro inserido SELECT * FROM table_name onde UserID = (selecione MAX (UserID) from table_name) No código PHP:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

Então você pode usar os dados buscados como seu requisito

Naveen1425
fonte
Não criptografe as senhas , pois quando o invasor obtiver o banco de dados, também obterá a chave de criptografia.
zaph
-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
Khamar Balkrishna
fonte