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

标签 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 文档):

  • 如果没有为名称参数指定序列名称, 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/

相关文章:

php - zend framework 2 tablegateway 选择出错

php - 如何使用 PHPs PDO 层设置 postgresql 客户端字符集?

php - 使用 php 和 mysql 迭代 PDO 查询

php - fatal error : Call to undefined function curl()

java - 如何在jsf中使用 session 过滤器作为登录表单

php - 从 PHP 中加载 .sql 文件

php - 我收到 Laravel Mysql 连接错误

Php表单提交,切换到另一个页面

php - 为什么要使用多个 PHP Exception 类

php - 设置 JQuery 选择不执行任何操作