PDO获取最后插入的ID

195

我有一个查询,我想要获取最后插入的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()

我做错了什么?

3个回答

447

那是因为那是一个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
7
@rybo111,首先它是“大喊大叫的蛇命名法”。其次,它是MySQL的命名约定,而不是PHP。 - azerafati
3
@rybo111,hmm SELECT LAST_INSERT_ID() 是一个MySQL函数。 - azerafati
48
或许这是一个愚蠢的后续问题,但我只想确保一下。当我依赖lastInsertId()时,它会返回在当前执行的代码中最后插入的ID吗?还是它会返回数据库中最后插入的ID?例如,如果我有一个流量很大的网站,在登陆脚本中插入了一些数据并使用lastInsertId()获取已插入的ID,但同时有很多人在登录,我可以放心地依赖lastInsertId()来获取特定代码实例中最后插入的ID吗?还是我会冒风险? - Art Geigel
57
这句话的意思是:它将是PDO实例底层连接中最后插入的ID。换句话说,在您所描述的场景中,它是安全的,因为并发查询将在单独的连接中进行。 - Corbin
显示剩余4条评论

27

只有在INSERT查询之后,lastInsertId()才能起作用。

正确:

$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

因此有了lastINSERTid的名字 ;) - mowgli

-6

6
欢迎来到Stack Overflow。我们重视有用的贡献,但请不要复制已有的答案。 - Your Common Sense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接