php的mysql_insert_id()返回值问题

最近使用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

posted on 2012-05-06 00:38  DavidYanXW  阅读(5423)  评论(0编辑  收藏  举报