使用PDO获取最后插入的行id(不合适的结果)


getting last inserted row id with PDO (not suitable result)

我有一个PDO::lastInsertId()方法的问题,它不返回最后插入行的id(主键),而是返回另一个字段,这是一个外键字段。

PHP代码:

$pdo = new PDO(...);
$stmt = $pdo->prepare($sql);
$stmt->bindParam(...);
$stmt->bindParam(...);
$stmt->execute();
$id = $pdo->lastInsertId();
// or
$id = $pdo->lastInsertId('services_id_seq'); // I think 'services_id_seq' is not necessary in MySQL
// both of them don't return the primary key of last inserted row
echo 'last inserted id: ' . $id;

MySQL表结构:

...
id          int unsigned not null primary key auto_increment
customer_id int unsigned not null
user_id     int unsigned not null
....

在MySQL中插入的行:

id    customer_id    user_id    ...
1     19             31         ...

PHP输出:

last inserted id: 19

它应该返回1而不是19。我不知道我的代码有什么问题。或者这是正常的行为:?

返回值:

  • 如果没有为name参数指定序列名称,PDO::lastInsertId()返回一个表示ID所在行的字符串插入到数据库中的最后一行。

  • 如果为name参数指定了序列名称,PDO::lastInsertId()返回一个字符串,表示从指定的序列对象检索到的最后一个值。

  • 如果PDO驱动程序不支持此功能,则PDO::lastInsertId()触发IM001 SQLSTATE

执行"SELECT LAST_INSERT_ID()"查询。
如果返回的ID仍然是19,而不是2(或者在所有尝试之后主键应该是什么),则MySQL存在问题,与PDO无关。您必须将其作为单独的案例(并且可能是单独的问题)进行研究,提供完整的SQL证明代码,能够在控制台中运行,涉及创建表、运行insert和选择LAST_INSERT_ID()

如果这个函数返回正确的值,但PDO仍然是错误的-你可能必须在bugs.php.net上报告它,再次提供完整的可复制代码和所有软件名称,并提供确切的版本号。

只有一件事要说清楚:你确定$sql变量在你的问题中包含正确的INSERT语句,而不是像INSERT ON DUPLICATE这样的东西吗?或者在这个INSERT上设置了任何触发器吗?

我最近查看了PDO::lastInsertId(),但发现手册中的描述不够令人信服(或者确实可以理解),因此选择使用这样的东西:

...
$stmt->execute();
$row = $stmt->fetch();
...

似乎对我有用。

我不是PDO或MySQL专家,所以这可能不太正确,但我也认为上述方法可以避免在线程的execute()和lastInsertID()调用之间将另一行插入数据库(由不同的用户/线程)的可能问题。

如果你热衷于保持lastInsertID()你是否调查过,在你的设置中,返回的ID必须是一个自动增量字段?手册暗示应该是这样的,但是非常模糊。

希望这对你有帮助。

欢呼,伊恩。