PHP/MySQL插入行然后得到'id'

Hin*_*wen 189 php mysql

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

我会像我说的那样做,但有没有办法可以做到这一点而不用担心插入行和获取ID之间的时间?

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

cle*_*tus 253

$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);
Run Code Online (Sandbox Code Playgroud)

mysqli_insert_id().

无论你做什么,都不要插入然后做" SELECT MAX(id) FROM mytable".就像你说的那样,这是竞争条件,没有必要.mysqli_insert_id()已经有这个功能.

  • PDO等价物是PDO :: lastInsertId(http://us3.php.net/manual/en/pdo.lastinsertid.php). (58认同)
  • @ zie1ony是的,它适用于一百万个异步插入,因为MySQL符合ACID标准.来自许多异步插入的每个单独插入都在其自己的*isolated*会话中,当您从PHP(或MySQL中的LAST_INSERT_ID())调用mysql_insert_id()时,ID就来自该会话 (16认同)
  • 如果同时有10000个异步插入,它仍然有效吗? (11认同)
  • 在doc上需要注意:`mysql_insert_id()会将本机MySQL C API函数mysql_insert_id()的返回类型转换为long类型(在PHP中命名为int).如果AUTO_INCREMENT列的列类型为BIGINT(64位),则转换可能会导致值不正确.而是在SQL查询中使用内部MySQL SQL函数LAST_INSERT_ID().有关PHP的最大整数值的更多信息,请参阅整数文档.\ (7认同)
  • 需要重写我写过的所有内容-_- (7认同)
  • 来自http://php.net/mysql_insert_id:"自PHP 5.5.0起,该扩展已弃用,将来将被删除.而应使用MySQLi或PDO_MySQL扩展." (2认同)

sou*_*rge 39

MySQL函数LAST_INSERT_ID()正是您需要的:它检索在此会话期间插入的id .因此,使用它是安全的,即使有其他进程(例如,其他人调用完全相同的脚本)将值插入到同一个表中.

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

  • NB`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://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id](http://dev.mysql.com/doc/ refman/5.0/EN /信息functions.html#function_last嵌-ID) (2认同)

Nat*_*per 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();
Run Code Online (Sandbox Code Playgroud)

  • 我们可以选择使用PDO*或*MySQLi(我在这里的另一个答案中描述).一个很好的比较:http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059 (4认同)

Luk*_*uke 20

作为@NaturalBornCamper说,mysql_insert_id现在已经过时,应该不会被使用.选项现在使用PDO或mysqli.NaturalBornCamper在他的回答中解释了PDO,因此我将展示如何使用mysqli_insert_id使用MySQLi(MySQL Improved).

// 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);
Run Code Online (Sandbox Code Playgroud)

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


leM*_*ela 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();
Run Code Online (Sandbox Code Playgroud)

这里发生的是我推入my_table两个新行.表的id是自动递增的.在这里,对于同一个用户,我添加了两行不同的行varNumb.

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