• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

php的mysql_insert_id()返回值问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

最近使用zencart的时候, 碰到了mysql_insert_id()返回值为0的情况,亲自实践了一下,弄明白了上一个连接的含义.

 

1. 先看mysql_insert_id()参数为空的情况

1) 连库1--insert1; 连库2--insert2.

<?php
$res1 = mysql_connect(...);
var_dump(mysql_thread_id());
mysql_select_db('...');
mysql_query('insert ...');
var_dump(mysql_insert_id());

$res2 = mysql_connect(...);
var_dump(mysql_thread_id());
mysql_select_db('...');
mysql_query('insert ...');
var_dump(mysql_insert_id());

?>

执行结果: 两次mysql_insert_id都正确返回了增加的AUTO_INCREMENT值. 符合预期.

2) 连库1--连库2--查询1--查询2

<?php
$res1 = mysql_connect(...);
var_dump(mysql_thread_id());

$res2 = mysql_connect(...);
var_dump(mysql_thread_id());

mysql_select_db('...');
mysql_query('insert ...');
var_dump(mysql_insert_id());

mysql_select_db('...');
mysql_query('insert ...');
var_dump(mysql_insert_id());
?>

执行结果: 第一次mysql_insert_id返回0, 第二次正确返回增加的AUTO_INCREMENT值.   不符合预期.

3) 连库--insert1--selct1

<?php
$res1 = mysql_connect(...);
var_dump(mysql_thread_id());

mysql_select_db('...');
mysql_query('insert into ....');

mysql_select_db('select ...');
mysql_query('...');
var_dump(mysql_insert_id());
?>

执行结果: mysql_insert_id返回0. 不符合预期.

4) 连库--insert1--update1/delete1/insert2

代码略.

执行结果: mysql_insert_id没有返回insert1的AUTO_INCREMENT值. 不符合预期.

2. mysql_insert_id()参数中指明数据库的句柄.

1) 连库1--insert1; 连库2--insert2.
代码略.
执行结果: 两次mysql_insert_id都正确返回了增加的AUTO_INCREMENT值. 符合预期.
2) 连库1--连库2--查询1--查询2
代码略.
执行结果: 两次mysql_insert_id都正确返回了增加的AUTO_INCREMENT值. 符合预期.
3) 连库--insert1--selct1
代码略.
执行结果: mysql_insert_id返回0. 不符合预期.
4) 连库--insert1--update1/delete1/insert2
代码略.
执行结果: mysql_insert_id没有返回insert1的AUTO_INCREMENT值. 不符合预期.

 

3. 总结.

1) 单数据库连接时, mysql_insert_id()需要紧跟在insert执行语句后面, 否则得不到预期的值, 和是否带有参数无关.

2) 多数据库连接时:

    a) mysql_insert_id()不带参数: 默认的数据库连接是最后一次mysql_connect的那个数据库连接.

    如果按照连库1--insert1... 连库n--insert n ,这样的顺序执行的话 ,可以得到预期值. 

    否则mysql_insert_id()会使用最后一次mysql_connect的数据库句柄.

    在现在复杂的业务需求里面, 很难保证顺序执行.

    b) mysql_insert_id($db)带参数. 

    遵循1)中的结论.

    演变为单数据库连接模式.

另外, mysql_insert_id()只能返回AUTO_INCREMENT值.

 

详细的mysql_insert_id原理可以参考下面的链接: 

lastInsertId只返回AUTO_INCREMENT值: http://blog.sina.com.cn/s/blog_51dea6c90100siu1.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
用php获取js变量的值发布时间:2022-07-10
下一篇:
php实现天干地支计算器示例php算命程序发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap