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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM