在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近使用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.
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 |
2022-08-18
2022-07-18
2022-08-17
2022-08-17
2022-11-06
请发表评论