簡體   English   中英

PDO + PHP lastInsertId()問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM