Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO获取最后插入的行id(结果不合适)_Php_Mysql_Pdo_Last Insert Id - Fatal编程技术网

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

Php 使用PDO获取最后插入的行id(结果不合适),php,mysql,pdo,last-insert-id,Php,Mysql,Pdo,Last Insert Id,我对PDO::lastInsertId()方法有一个问题,它不返回上次插入行的id(主键),而是返回另一个字段,该字段是外键字段 PHP代码: MySQL表结构: 在MySQL中插入行: PHP输出: 它应该返回1而不是19。我不知道我的代码有没有问题。。或者这是正常的行为: 返回值(PHP文档): 如果没有为name参数指定序列名称, PDO::lastInsertId()返回一个字符串,该字符串表示 插入到数据库中的最后一行 如果为name参数指定了序列名称,PDO::lastInsert

我对
PDO::lastInsertId()
方法有一个问题,它不返回上次插入行的id(主键),而是返回另一个字段,该字段是外键字段

PHP代码:

MySQL表结构:

在MySQL中插入行:

PHP输出:

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

返回值(PHP文档):

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

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

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


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

...
$stmt->execute();
$row = $stmt->fetch();
...
这似乎对我有用

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

如果您希望保留lastInsertID(),您是否调查过在设置中返回的ID是否必须是自动递增字段?手册中的提示应该是这样的,但是毫无希望的含糊不清(IMHO)

希望这能有所帮助

干杯,伊恩。

运行
“选择最后一个插入ID()”
查询。
如果返回的ID仍然是19,而不是2(或者在所有尝试之后主键应该是什么),那么MySQL就有问题,与PDO无关。您必须将其作为一个单独的案例(可能还有一个单独的问题)进行研究,提供完整的SQL验证代码,能够在控制台中运行,包括创建表、运行insert和选择LAST_insert_ID()

如果此函数返回正确的值,但PDO仍然返回错误的值,那么您可能必须在bugs.php.net上对其进行错误报告,并再次提供完整的可复制代码和所有软件名以及确切的版本号

只有一件事需要澄清:您确定问题中的
$sql
变量包含正确的INSERT语句,而不是类似于INSERT ON DUPLICATE之类的语句吗?
或者在这个插件上设置了任何触发器?

获取序列号并不是那么容易@GreenRover谢谢,也是postgresql:(我正在使用MySQL,我想知道是不是正确的方法?或者我犯了一个错误,我只红了序列而不是标签。对于MySQL,它看起来是正确的
$id=$PDO->lastInsertId()
。但是检查您的插入可能无效,您会得到上次插入的结果。@lan thanx。是的,它是
自动增量
,并且我编辑了我的问题并添加了mysql表结构。它是:
$sql='插入“服务”(“客户id”,“用户id”,…)值(:客户id,:用户id,…)“;
其他字段只是varchars和datetime类型的列。而且没有触发器集。我正在检查您的解决方案
...
id          int unsigned not null primary key auto_increment
customer_id int unsigned not null
user_id     int unsigned not null
....
id    customer_id    user_id    ...
1     19             31         ...
last inserted id: 19
...
$stmt->execute();
$row = $stmt->fetch();
...