最近使用zencart的时候, 碰到了mysql_insert_id()返回值为0的情况,亲自实践了一下,弄明白了上一个连接的含义.
1. 先看mysql_insert_id()参数为空的情况
1) 连库1--insert1; 连库2--insert2.
执行结果: 两次mysql_insert_id都正确返回了增加的AUTO_INCREMENT值. 符合预期.
2) 连库1--连库2--查询1--查询2
执行结果: 第一次mysql_insert_id返回0, 第二次正确返回增加的AUTO_INCREMENT值. 不符合预期.
3) 连库--insert1--selct1
执行结果: 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值: