php – mysql_insert_id和last_insert_id错误的行为

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – mysql_insert_id和last_insert_id错误的行为脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这张桌子
CREATE TABLE IF NOT EXISTS `t5` (
  `id` int(11) NOT NULL auto_increment,`a` int(11) NOT NULL,`b` int(11) NOT NULL,Primary KEY  (`id`),unique KEY `a` (`a`,`b`)
 ) ENginE=InnoDB DEFAULT CHARSET=latin1  ;

a_b是一个唯一的密钥.

我有这样的PHP代码

$db = DBFactory::getInstance();
 $db->selectDB('test');
 $db->query("insert into t5 (a,b) values(1,1) on duplicate key update a=1,b=1");
 var_dump(MysqL_insert_id());

 $cur = $db->query("select last_insert_id()");
 VAR_dump(MysqL_fetch_assoc($cur));

通过运行此代码两次,在我的电脑上,结果是
1

int(1)
array(1) {
  ["last_insert_id()"]=>
  string(1) "1"
}

第2

int(1)
array(1) {
  ["last_insert_id()"]=>
  string(1) "2"
}

你可以看到,两次MysqL_insert_id()返回相同的值“1”,这对我来说没问题,因为我想知道插入后的真实id,而不是下一个auto_increment值.

但是,当我在另一个环境中运行此代码两次:
1

int(1)
array(1) {
  ["last_insert_id()"]=>
  string(1) "1"
}

第2

int(2)
array(1) {
  ["last_insert_id()"]=>
  string(1) "2"
}

正如您所看到的那样,第二次的结果MysqL_insert_id()返回与last_insert_id()相同的值.

这个结果太可怕了,但我不知道为什么.我的代码在这两种环境中运行良好约3个月,直到今天才发生这种情况.谁能解释一下?我在大约30天前将第二个环境的PHP版本升级到5.3.8,没有其他更改.这是一个错误吗?

更新

我切换到第三个MysqL服务器(5.1.38-LOG),第二个插入返回
INT(0)
array(1){
[ “LAST_INSERT_ID()”] =>
string(1)“0”
}

所以我意识到问题可能是关于MysqL版本.

最后,我将表定义更改为

DROP TABLE IF EXISTS `t5`;
CREATE TABLE IF NOT EXISTS `t5` (
  `id` int(11) NOT NULL auto_increment,`t` int(11) NOT NULL,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

还要编辑我的脚本

$db = DBFactory::getInstance();
$db->selectDB('test');
$db->query("insert into t5 (a,b,t) values(1,1,".time().") on duplicate key update a=1,b=1,t=".time());
//$db->query("insert ignore into t5 (a,1)");
var_dump(MysqL_insert_id());

$cur = $db->query("select last_insert_id()");
var_dump(MysqL_fetch_assoc($cur));

不同的MysqL服务器返回相同的MysqL_insert_id但不同的last_insert_id()

5.0.24a社区-NT

int(1)
array(1) {
  ["last_insert_id()"]=>
  string(1) "2"
}

5.0.51a日志

int(1)
array(1) {
  ["last_insert_id()"]=>
  string(1) "2"
}

5.1.38日志

int(1)
array(1) {
  ["last_insert_id()"]=>
  string(1) "0"
}

是否有任何系统变量控制此行为?如果有人知道那会很有意思.如果没有@R_419_2495@案,我唯一能做的就是强制插入这样的更新某些具有不同值的字段……

我认为你试图使用last_insert_id()是不可能的 – 在这种情况下你没有插入任何东西,所以你也不应该信任返回值.从 MySQL docs开始

但是,似乎有一个解决方法(相同的文档) – 手动设置last_insert_id:

脚本宝典总结

以上是脚本宝典为你收集整理的php – mysql_insert_id和last_insert_id错误的行为全部内容,希望文章能够帮你解决php – mysql_insert_id和last_insert_id错误的行为所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。