2012-04-11 51 views
3

也許我的問題是愚蠢的,但有一件事我想知道關於mysql_insert_id()。在php.net上寫有以下內容:也許mysql_insert_id()將返回意外的ID

檢索上一個查詢(通常是INSERT)爲AUTO_INCREMENT列生成的ID。

如果在腳本到達使用mysql_insert_id()的行之前,此函數的輸出將會如何?另一個腳本在數據庫中插入某些內容?

據我所知,它會返回最後插入的項目的id(從哪裏來無所謂)。如果我是對的,我希望知道如何避免這個問題,但是在插入查詢執行時立即使用mysql_insert_id()(因爲仍然有一些機會陷入「麻煩」)。

回答

3

它將返回在當前會話中插入的最後一行的ID,因此您無需擔心。事實上,您將鏈接標識符作爲參數傳遞,否則它將默認打開最後一個鏈接。來自文檔

MySQL連接。如果未指定鏈接標識符,則假定由mysql_connect()打開的最後一個鏈接 。如果找不到這樣的鏈接,則會嘗試創建一個,就好像調用mysql_connect()時不帶參數一樣使用 。如果未找到或建立連接,則會生成E_WARNING 級別的錯誤。

所以,如果你有

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 
mysql_select_db('mydb'); 

mysql_query("INSERT INTO mytable (product) values ('kossu')"); 
printf("Last inserted record has id %d\n", mysql_insert_id()); 

這將始終是正確的(如果有mytable的AUTO_INCREMENT列,當然),因爲它檢索的最後一個會話生成的ID。如果在同一時間另一個用戶運行完全相同的查詢,他將有不同的會話,他會正確地得到他的ID

+0

+1。 MySQL是一個多用戶數據庫;他們提前預見到了這樣的問題。 :) – 2012-04-11 15:45:50