我对 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 文档):
如果没有为名称参数指定序列名称,
PDO::lastInsertId()
返回表示行ID
的字符串的 插入数据库的最后一行。如果为名称参数指定了序列名称,
PDO::lastInsertId()
返回表示从指定序列对象检索到的最后一个值的字符串。如果
PDO
驱动程序不支持此功能,PDO::lastInsertId()
触发IM001 SQLSTATE
.
最佳答案
运行 "SELECT LAST_INSERT_ID()"
查询。
如果返回的 ID 仍然是 19,而不是 2(或者在所有尝试之后主键应该是什么),则 MySQL 有问题,与 PDO 无关。您必须将其作为一个单独的案例(并且可能是单独的问题)进行调查,提供完整的 SQL 验证代码,能够在控制台中运行,涉及创建表、运行插入和选择 LAST_INSERT_ID()
如果此函数返回正确的值但 PDO 仍然是错误的 - 您可能必须在 bugs.php.net 上报告错误,再次提供完整的可重现代码和所有软件名称以及提供的确切版本号。
只有一件事需要说明:您确定问题中的 $sql
变量包含正确的 INSERT 语句,而不是 INSERT ON DUPLICATE 之类的语句吗?
还是在此 INSERT 上设置了任何触发器?
关于php - 使用 PDO 获取最后插入的行 ID(不合适的结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14313837/