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

时间:2013-01-14 05:51:09

标签: php mysql pdo last-insert-id

我遇到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。我不知道我的代码是否有任何问题......或者这可能是正常行为:?

返回值(PHP文档):

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

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

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

2 个答案:

答案 0 :(得分:1)

运行"SELECT LAST_INSERT_ID()"查询 如果返回的ID仍然是19,而不是2(或者所有尝试后都应该是主键),则MySQL存在问题,与PDO无关。您必须将其作为一个单独的案例(可能是单独的问题)进行调查,提供完整的SQL证明代码,能够在控制台中运行,包括创建表,运行插入和选择LAST_INSERT_ID()

如果此函数返回正确的值但PDO仍然错误 - 你必须在bugs.php.net上进行bug报告,再次使用完整的可重现代码和所有提供确切版本号的软件名称。

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

答案 1 :(得分:-1)

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

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

这似乎对我有用。

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

如果您热衷于保留lastInsertID(),您是否已经调查过,在您的设置中,返回的ID是否必须是自动增量字段?手动的提示,这应该是这样但是无望的模糊(恕我直言)。

希望有所帮助。

干杯,伊恩。