2014-01-17 47 views
4

我想知道lastInsertId()的工作原理。 Atm,我這樣使用它來獲取插入行的ID,以便我可以在代碼的其他部分使用此ID。例如:lastInsertId()是否獲取由該腳本或整體插入的最後一個ID?

$stmt = $db->prepare('INSERT INTO image_table (image_name, image_size) VALUES (:image_name, :image_size)'); 

$stmt->execute(array(
    'image_name' => $photoName, 
    'image_size' => $image_size/1024, 
    )); 

$lastInsertId = $db->lastInsertId('yourIdColumn'); 

好吧,我的問題是:

1)這個腳本是否得到lastInsertId因爲這是在特定的腳本完成的SQL插入?

2)例如,3個不同的用戶將數據插入同一個表中只有幾納秒的差異。事情是這樣的:

this script -> Inserts to row id 1 
Another user -> Inserts to row id 2 
Another user -> Inserts to row id 3 

在這種情況下,將在lastInsertId()返回值1,因爲它是由該腳本插入或將它返回3,因爲這是最後的ID由該行的最後一個ID時間腳本到達執行lastInsertId()函數的行嗎?

+2

這是會話特定的。 – Strawberry

+3

對於該腳本/會話;否則這將是相當無用的 –

+0

完美!感謝澄清....我很擔心,因爲如果它提取了整體ID,那麼它可能是一個安全問題,在我的情況。很高興每個腳本/會話。 – Neel

回答

4
  1. 最後 SQL的ID插入的腳本執行(不說,其他用戶相互競爭的插入)。

  2. 當你有3個 刀片,它可以讓你的 lastInsertId()喜歡它指出,最後一個,但並非所有3,而不是2 ......剛剛過去的一個。通過單獨運行插入操作並獲取標識符來對付這種情況,或者如果您需要再次提取數據,則只需根據插入標準進行搜索。 由不同的用戶/會話插入,請參閱答案#1,lastInsertId()適用於特定的用戶/會話/執行,而不適用於所有操作。在後臺還有基本的MYSQL數據庫臨時操作,如果這是真的,它將返回ids。

希望有所幫助。

+1

1是現貨,實際上也回答2。 2的答案不適用,因爲問題是關於不同的用戶,而不是關於同一腳本中的三個陳述。 – GolezTrol

+0

...哎呀我讀爲「如果我插入3個用戶」到一個表(1 sql查詢),將更正答案 – Jakub

+2

我認爲更好的答案是lastInsertId返回給定連接的最後插入的ID。我可以在同一個腳本中插入許多DB連接,每個連接插入不同的信息(甚至是連接到同一個DB的多個DB連接),並在每個連接上調用lastInsertId,並獲得不同的結果。在這個意義上使用術語'用戶'有點含糊。術語會話更好,因爲每個連接都有自己的會話。 +1,儘管如此,因爲我相信你的回答會得到重點,而我的問題純粹是語義問題。 –