[英]PDO + PHP lastInsertId() issue
如果例如當用戶點擊鏈接,自動插入新行然后php代碼請求最后插入的id,同時另一個用戶插入另一行時,它不會有問題嗎?所以返回的id實際上不是我期待的那個..?
我錯了嗎? 沒有“安全”漏洞,有沒有辦法做同樣的事情?
(可能來自准備好的聲明或其他內容......)
PS自動生成id。
謝謝。
如手冊中所述:
LAST_INSERT_ID()
(不帶參數)返回一個BIGINT
(64位)值,表示由最近執行的INSERT
語句為AUTO_INCREMENT
列設置的第一個自動生成的值,以影響此類列。 例如,在插入生成AUTO_INCREMENT
值的行后,您可以獲得如下值:mysql>SELECT LAST_INSERT_ID(); ->195
當前正在執行的語句不會影響
LAST_INSERT_ID()
的值。 假設您使用一個語句生成AUTO_INCREMENT
值,然后在多行INSERT
語句中引用LAST_INSERT_ID()
,該語句將行插入到具有自己的AUTO_INCREMENT
列的表中。LAST_INSERT_ID()
的值將在第二個語句中保持穩定; 它的第二行和后一行的值不受先前行插入的影響。 (但是,如果混合對LAST_INSERT_ID()
和LAST_INSERT_ID(expr)
引用,則效果未定義。)如果前一個語句返回錯誤,則
LAST_INSERT_ID()
值未定義。 對於事務表,如果由於錯誤而回滾語句,則LAST_INSERT_ID()
的值未定義。 對於手動ROLLBACK,LAST_INSERT_ID()
值不會恢復到事務之前的值; 它仍然像ROLLBACK那樣 。
因此, LAST_INSERT_ID()
始終是事務安全的(即使您不使用事務)。
成功INSERT
后,MySQL Server將插入ID作為OK
消息的一部分進行傳輸。 此ID存儲在PDO中,因此無需往返服務器PDO可以安全地為您的連接返回正確的ID。
參考: http : //forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#OK_Packet
要抵消這種情況,您將使用交易 。
這實際上會將您的插入與其他插入隔離,因此只要您的Insert / lastInsertId()
調用在同一個事務中,它就可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.