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