PDO获取最后插入的ID


158

我有一个查询,我想插入最后一个ID。字段ID是主键,并且是自动递增的。

我知道我必须使用以下语句:

LAST_INSERT_ID()

该语句适用于如下查询:

$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())";

但是,如果我想使用以下语句获取ID:

$ID = LAST_INSERT_ID();

我收到此错误:

Fatal error: Call to undefined function LAST_INSERT_ID()

我究竟做错了什么?

Answers:


367

那是因为那是SQL函数,而不是PHP。您可以使用PDO::lastInsertId()

喜欢:

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

如果要使用SQL而不是PDO API来执行此操作,则可以像普通的select查询一样执行:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();

1
是的,您是对的,我找到了它,并且它起作用了,谢谢,我将接受答复
William Kinaan 2012年

7
@ rybo111,首先是Screaming snake case。其次,它是MySQL的命名约定,而不是PHP
azerafati 2015年

2
@ rybo111,hmm SELECT LAST_INSERT_ID()是MySQL函数
azerafati 2015年

32
所以也许这是一个愚蠢的跟进问题,但我只是想确定一下。当我依靠lastInsertId()时,它会返回当前正在执行的代码中发生的最后插入的ID吗?还是返回整个数据库中最后插入的ID?例如,如果我有一个人流量大的网站,并且在登录脚本中插入了一些内容,并使用lastInsertId()来获取插入的iD,但是很多人同时登录,那么我是否可以依靠lastInsertId( )从执行该代码的特定实例中获取最后插入的ID?还是冒着风险
Art Geigel

41
@ArtGeigel这将是PDO实例基础连接的最后插入的ID。换句话说,在您描述的场景中这是安全的,因为并发查询将在单独的连接中进行。
科尔宾2015年

15

lastInsertId()仅在INSERT查询之后起作用。

正确:

$stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass) 
                              VALUES(?,?,?);");
$sonuc = $stmt->execute([$username,$email,$pass]);
$LAST_ID = $this->conn->lastInsertId();

不正确:

$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0

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.