PHP / MySQL插入行,然后获取“ id”


192

当我插入一行时,表格的“ id”字段会自动增加。我想插入一行,然后获取该ID。

我会按照我说的去做,但是有没有办法不用担心插入行和获取ID之间的时间呢?

我知道我可以在数据库中查询与输入的信息匹配的行,但是变化很大,将有重复项,唯一的区别是id。

Answers:


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

请参阅mysqli_insert_id()

无论您做什么,都不要插入然后执行“ SELECT MAX(id) FROM mytable”。就像您说的那样,这是比赛条件,没有必要。mysqli_insert_id()已经具有此功能。


58
PDO等效于PDO :: lastInsertId(us3.php.net/manual/en/pdo.lastinsertid.php)。
马修·弗莱申

11
如果同时有10000个异步插入,它是否仍然有效?
zie1ony

16
@ zie1ony是的,因为MySQL符合ACID,所以它可以处理一百万次异步插入。很多异步插入中的每个插入都在其自己的隔离会话中,当您从PHP(或MySQL中的LAST_INSERT_ID())调用mysql_insert_id()时,ID就会来自该位置
rodrigo-silveira 2012年

7
在文档上有一些要注意的地方: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
需要重写我曾经写过的所有内容-_-
de_nuit

39

MySQL函数LAST_INSERT_ID()可以满足您的需要:它检索在此会话期间插入的ID 。因此,即使存在其他将值插入同一表的进程(例如,其他人调用完全相同的脚本),也可以安全使用。

PHP函数mysql_insert_id()不一样的调用SELECT LAST_INSERT_ID()mysql_query()


2
注意 echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); :第二个数字mysql_insert_id()不能反映600,而是在第二个数字mysql_query('SELECT LAST_INSERT_ID()')。为了mysql_insert_id()反映更改,您必须先执行插入或更新操作(这可能会影响0行)。请参阅以下文章的最后一段:http
Cliffordlife

28

至于PHP的网站,现已弃用mysql_insert_id,我们必须使用PDO。要使用PDO进行此操作,请按照以下步骤操作:

$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
我们可以选择使用PDO MySQLi(我在此处的另一个答案中对此进行了描述)。一个很好的比较:code.tutsplus.com/tutorials/…–
路加福音

20

作为@NaturalBornCamper说,mysql_insert_id现在已经过时,应该不会被使用。现在可以选择使用PDO或mysqli。NaturalBornCamper在他的回答中解释了PDO,因此我将展示如何使用mysqli_insert_idMySQLiMySQL改进的)进行操作

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

查看PHP文档以获取更多示例:http : //php.net/manual/zh/mysqli.insert-id.php


感谢您抓住这一点。我真的更喜欢Javascript的点符号而不是PHP的箭头符号。:/
路加福音

7

我只想添加一点有关的细节lastInsertId()

一次输入多个行时,它不会返回最后一个ID,而是最后一个插入集合的第一个ID。

考虑下面的例子

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

这里发生的是,我推了my_table两行。该表的ID为自动递增。在这里,对于同一个用户,我添加了两个具有不同的行varNumb

最后的回显值将等于其中的行的ID varNumb=1,这意味着不是最后一行的ID,而是最后一个请求中添加的第一行的ID。


一次只执行一项操作-似乎是所用所有方法的整体答案,以避免发生意外行为
RozzA 2016年

1

一个例子。

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

代码行将$course_id = $query_new->insert_id;显示最后插入的行的ID。希望这可以帮助。


1

尝试这样,您可以获得答案:

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

看一下以下链接:

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

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

另请注意,此扩展在PHP 5.5中已弃用,在PHP 7.0中已删除



0

试试这个...对我有用!

$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

另一个可能的答案是:

当您定义表格时,它将具有列和数据。列ID可以具有属性AUTO_INCREMENT

通过这种方法,您不必担心id,它会自动生成

例如(摘自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)
)

希望这对某人有帮助。

编辑:这只是您定义如何生成自动ID,在创建后获取它的部分,之前的正确答案是正确的。


这根本不可能解决,OP已经声明他们正在使用自动递增(自动递增)。OP希望检索该自动生成的ID。
RozzA 2013年

好的,再次阅读后,我发现问题不仅在于生成ID,OP还希望获取该ID。感谢您的定义:D
neoSmith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.