如何在PHP中获取MySQL表的最后一个插入ID?

如何在PHP中获取MySQL表的最后一个插入ID?,php,mysql,Php,Mysql,我有一个经常插入新数据的表。我需要得到这张桌子的最后一个ID。我该怎么做 它是否类似于从表中选择最大值(id)?如果它们是唯一的,并且是自动递增的,那么您编写的内容将获得最大的id,如果您对邀请并发问题没有意见,这将是很好的。 由于您使用的是MySQL作为数据库,因此有一个特定的函数,它只在执行插入操作的当前连接上起作用。 PHP也提供了一个特定的函数来调用它。如果您使用的是PDO,请使用 如果您正在使用Mysqli,请使用 如果您仍在使用Mysql: 。它们不再得到维护。看到了吗?相反,学习,

我有一个经常插入新数据的表。我需要得到这张桌子的最后一个ID。我该怎么做


它是否类似于从表中选择最大值(id)?

如果它们是唯一的,并且是自动递增的,那么您编写的内容将获得最大的
id
,如果您对邀请并发问题没有意见,这将是很好的。
由于您使用的是MySQL作为数据库,因此有一个特定的函数,它只在执行插入操作的当前连接上起作用。
PHP也提供了一个特定的函数来调用它。

如果您使用的是PDO,请使用

如果您正在使用Mysqli,请使用

如果您仍在使用Mysql:

。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO


但如果你必须这样做,那就用吧。

没关系。此外,您还可以使用

有一个函数来了解当前连接中插入的最后一个id是什么

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
另外,使用max是一个坏主意,因为如果在两个不同的会话中同时使用代码,则可能会导致问题


该函数称为

可以使用
mysql\u insert\u id()
, 但是关于使用它有一个特别的注意事项,您必须在执行INSERT查询之后调用它,这意味着在同一脚本会话中。 如果您使用它,否则它将无法正常工作。

使用:

与:



。它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果选择PDO,.

注意:如果使用一条语句进行多个插入,mysqli::insert\u id将不正确

下表:

创建表xyz(id int(11)自动递增,名称varchar(255),主键(id))

现在如果你这样做了:

插入xyz(名称)值('1')、('2')、('3')

mysqli::insert_id将是1而不是3

要获得正确的值,请执行以下操作:

mysqli::插入\u id+mysqli::受影响的\u行)-1


这是一个文档,但有点模糊。

使用
MySQLi
事务时,我有时无法获取
MySQLi::$insert\u id
,因为它返回0。特别是当我使用存储过程时,执行
INSERT
s。因此,在交易中还有另一种方式:

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

?>

您可以通过内置php函数
mysql_insert_id()获取最新插入的id

您还可以通过

$id = last_insert_id();

我更喜欢使用纯MySQL语法来获取我想要的表的最后一个自动增量id

php mysql\u insert\u id()和mysql last\u insert\u id()只提供最后一个事务id

如果您想要架构中任何表的最后一个自动递增ID(不仅仅是最后一个事务),可以使用此查询

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

就是这样。

获取codeigniter中最后一个插入的id 执行insert查询后,只需在数据库上使用一个名为
insert\u id()
的函数,它将返回上次插入的id

例:

一行

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

很遗憾没有看到任何例子的答案

使用Mysqli::$insert\u id:

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

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

试试这个应该可以很好地工作:

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

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

echo mysqli_insert_id($link);

使用mysqli,因为mysql正在去润滑

<?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();
?>
干净简单-

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

mysqli_insert_id($dbConnectionObj)
这将返回当前连接的最后一个插入id,因此,如果您正确管理连接,这应该可以工作。至少对我有用。

试试这个:

$sql = "INSERT INTO table_name VALUES (nininini)";
mysqli_query($connection, $sql);
mysqli_insert_id($connection);

是的,此查询将返回表的最后一个id。但有一个条件是ID必须是主键。所以你可以避免后悔。@sathish:该方法的主要问题是并发性。详细说明:该方法的问题是,如果其他人在你的
INSERT
和查询
MAX(id)
之间的表中插入了内容,你可能会得到一个不是你最后一个身份证的身份证。@Jocelyn一年后,这个问题被问到,比这个问题少了数千次浏览量。@Neal,你说得对。另一个问题应该与这个问题重复。这个问题的问题是如果你有很多插入发生(例如你的数据库也记录了一些东西),你可能会得到错误的ID。@Mike如果你在你的
mysql\u查询之后立即使用
mysql\u insert\u ID
。当然,如果您在两个连接之间的同一个连接上执行多个其他查询,那么,在这方面没有什么可以帮助您。为了保证您永远不会得到错误的id,请使用一个。mysql确保这是当前连接的最后一个id,因此如果您将此语句放在insert查询之后,就不会有问题。无需担心其他进程执行插入。无需将其包装到事务中。mysql手册中说:“生成的ID在服务器上按每个连接进行维护。这意味着函数返回给给定客户端的值是为影响该客户端的自动增量列的最新语句生成的第一个自动增量值。这就是您不应使用select MAX(ID)的原因。”@deceze,我们随处可见的
PDO
偏见是怎么回事?让我们再看一次。很明显,当你需要用低级的东西弄脏你的双手时,
mysqli
是赢家。换句话说,即使你选择了PDO,他最终还是需要使用
mysqli
。而且,这是错误的,因为这是在暗示要使用不推荐使用的库,请删除this@STTLCU这里哪一个片段不推荐使用?@TheBlackBenzKid两者都有,因为它们是基于mysql的functions@Rahul$id=last_insert_id();可能不推荐使用。mysql(…)在PHP>=5.5版本中不推荐使用。是的,我只是记得。:)为什么说
select max(id)从表中看
可以吗?谢谢您的注意。我已经编辑了代码,实际上是$link(保存连接的变量),我怀疑它已经满了
mysqli_insert_id($dbConnectionObj)
$sql = "INSERT INTO table_name VALUES (nininini)";
mysqli_query($connection, $sql);
mysqli_insert_id($connection);