Inserir linha PHP / MySQL e obter 'id'


192

O campo 'id' da minha tabela aumenta automaticamente quando insiro uma linha. Quero inserir uma linha e, em seguida, obter esse ID.

Eu faria isso da maneira que disse, mas existe uma maneira de fazer isso sem me preocupar com o tempo entre inserir a linha e obter o ID?

Eu sei que posso consultar o banco de dados em busca da linha que corresponde às informações inseridas, mas há uma alta alteração, haverá duplicatas, com a única diferença sendo o ID.

Respostas:


255
$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);

Veja mysqli_insert_id().

Faça o que fizer, não insira e faça um " SELECT MAX(id) FROM mytable". Como você diz, é uma condição de corrida e não há necessidade. mysqli_insert_id()já possui essa funcionalidade.



11
Ainda funciona se houver 10000 inserções assíncronas ao mesmo tempo?
Zie1ony 10/08/12

16
@ zie1ony Sim, funcionaria para um milhão de inserções assíncronas porque o MySQL é compatível com ACID. Cada inserção indivíduo das muitas inserções assíncronos está dentro de seu próprio isolado sessão, que é onde a ID vem de quando você chamar mysql_insert_id () do seu PHP (ou LAST_INSERT_ID () no MySQL)
rodrigo-silveira

7
No documento, há algo a ser observado: mysql_insert_id() will convert the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT (64 bits) the conversion may result in an incorrect value. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query. For more information about PHP's maximum integer values, please see the integer documentation.\
Elbek

7
necessidade de reescrever tudo o que eu já escrevi -_-
de_nuit

39

A função MySQL LAST_INSERT_ID()faz exatamente o que você precisa: recupera o ID que foi inserido durante esta sessão . Portanto, é seguro usá-lo, mesmo que haja outros processos (outras pessoas chamando exatamente o mesmo script, por exemplo) inserindo valores na mesma tabela.

A função PHP mysql_insert_id()faz o mesmo que chamar SELECT LAST_INSERT_ID()com mysql_query().


2
NB echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); O segundo mysql_insert_id()não reflete 600, onde como mysql_query('SELECT LAST_INSERT_ID()')será. Para mysql_insert_id()que isso reflita a alteração, você deve primeiro fazer uma inserção ou uma atualização (que pode afetar 0 linhas). Veja último parágrafo do: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

Quanto ao site do PHP, o mysql_insert_id agora está obsoleto e devemos usar o DOP. Para fazer isso com o DOP, proceda da seguinte maneira:

$db = new PDO('mysql:dbname=database;host=localhost', 'user', 'pass');
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)');
$statement->execute( array(':name' => 'Bob', ':city' => 'Montreal') );

echo $db->lastInsertId();

4
Temos a opção de usar o DOP ou o MySQLi (que descrevo em outra resposta aqui). Uma boa comparação: code.tutsplus.com/tutorials/…
Luke

20

Como o @NaturalBornCamper disse, o mysql_insert_id agora está obsoleto e não deve ser usado. As opções agora são usar PDO ou mysqli. NaturalBornCamper explicou o DOP em sua resposta, então mostrarei como fazê-lo com o MySQLi ( MySQL Improved ) usando mysqli_insert_id .

// First, connect to your database with the usual info...
$db = new mysqli($hostname, $username, $password, $databaseName);
// Let's assume we have a table called 'people' which has a column
// called 'people_id' which is the PK and is auto-incremented...
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')");
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with:
$lastInsertedPeopleId = $db->insert_id;
// OR
$lastInsertedPeopleId = mysqli_insert_id($db);

Consulte a documentação do PHP para obter mais exemplos: http://php.net/manual/en/mysqli.insert-id.php


Obrigado por capturar isso. Eu realmente prefiro a notação de ponto do Javascript sobre a notação de seta do PHP. : /
Luke

7

Eu só quero adicionar um pequeno detalhe a respeito lastInsertId();

Ao inserir mais de uma linha por vez, ele não retorna o último ID , mas o primeiro ID da coleção das últimas inserções.

Considere o seguinte exemplo

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

O que acontece aqui é que eu empurro my_tableduas novas linhas. O ID da tabela é incrementado automaticamente. Aqui, para o mesmo usuário, adiciono duas linhas com uma diferente varNumb.

O valor ecoado no final será igual ao ID da linha em varNumb=1que, o que significa não o ID da última linha, mas o ID da primeira linha que foi adicionada na última solicitação.


vara para uma operação de cada vez - parece ser a resposta global para todos os métodos utilizados, para evitar comportamentos inesperados
ROZZA

1

Um exemplo.

    $query_new = "INSERT INTO students(courseid, coursename) VALUES ('', ?)";
    $query_new = $databaseConnection->prepare($query_new);
    $query_new->bind_param('s', $_POST['coursename']);
    $query_new->execute();
    $course_id = $query_new->insert_id;
    $query_new->close();

A linha de código $course_id = $query_new->insert_id;exibirá o ID da última linha inserida. Espero que isto ajude.


1

Tente assim, você pode obter a resposta:

<?php
$con=mysqli_connect("localhost","root","","new");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')");

// Print auto-generated id
echo "New record has id: " . mysqli_insert_id($con);

mysqli_close($con);
?>

Veja os seguintes links:

http://www.w3schools.com/php/func_mysqli_insert_id.asp

http://php.net/manual/en/function.mysql-insert-id.php

Além disso, observe que esta extensão foi preterida no PHP 5.5 e removida no PHP 7.0



0

Tente isso ... funcionou para mim!

$sql = "INSERT INTO tablename (row_name) VALUES('$row_value')";
    if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    $msg1 = "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    $msg_error = "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

-1

Outra resposta possível será:

Quando você define a tabela, com as colunas e os dados que ela terá. O ID da coluna pode ter a propriedade AUTO_INCREMENT .

Por esse método, você não precisa se preocupar com o ID , ele será feito automaticamente .

Por exemplo (extraído de w3schools )

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

Espero que isso seja útil para alguém.

Editar: Esta é apenas a parte em que você define como gerar um ID automático, para obtê-lo após a criação, as respostas anteriores antes estão corretas.


essa não é uma resposta possível, o OP já afirma que está usando o incremento automático (aumentos automáticos). O OP deseja recuperar esse ID gerado automaticamente.
ROZZA

Ok, depois de ler novamente, notei que o problema não é apenas gerar o ID, o OP também deseja obtê-lo. Obrigado pela definição: D
neoSmith
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.