2016-03-22 47 views
0

隨着mysqli的最後插入的ID可以從準備好的語句對象進行檢索,例如:PHP PDO最後插入編號

$pstm->execute(); 
$pstm->insert_id; 

然而,隨着PDO這有在數據庫級別做。例如:

$lastId = $dbh->lastInsertId(); 

我雖然該PDO是爲了取代mysql/mysqli,爲什麼這個設計決定呢?如果兩個插入命令同時運行會怎麼樣?由於插入的ID不是作用域給定的命令可能它檢索錯誤的ID?

由於

+3

它仍然是con nection based –

+1

我假設'mysqli'只是在運行每個查詢後抓住它,但PDO讓你自己抓住它。 – tadman

+2

你不能比較pdo到mysql。 pdo是獨立於數據庫的, –

回答

1

MySQL的LAST_INSERT_ID功能被維持在會話(數據庫連接)電平。不在個別準備好的聲明。該函數返回

作爲最近執行的INSERT語句的結果,第一個自動生成的值已成功插入AUTO_INCREMENT列。


「我認爲,PDO是爲了替代在MySQL/MySQLi」

我認爲PDO本來是一個替代到mysql_和mysqli_接口。 PDO與其中任何一個都有很大的不同。首先,除了MySQL之外,還有許多數據庫的PDO數據庫驅動程序(例如DB2,Oracle,PostgreSQL,SQL Server等)。

相比之下,mysqli_接口專門支持MySQL(和MariaDB的版本< 10.0,以及可能的其他幾個人是MySQL的兼容。)


「爲什麼要採取這樣的設計決策?」

我認爲PDO設計更貼近地遵循MySQL數據庫本身的LAST_INSERT_ID函數的模式。 PDO和mysqli都提供了「包裝器」功能,作爲執行和檢索SELECT LAST_INSERT_ID()語句的結果集的便捷方式。

我相信PDO的開發者打算將它作爲一個輕量級且一致的多數據庫接口。創建一個替代mysql/mysqli的drop並不是主要的設計目標。


「如果兩個插入命令同時運行會怎樣?」

在單個MySQL數據庫會話上「同時」運行兩個INSERT語句是不可能的。他們會連續運行。

在MySQL中,檢索從第一個INSERT語句的AUTO_INCREMENT值,即第一條語句將需要隨後被執行SELECT LAST_INSERT_ID()之前第二INSERT語句。


「因爲插入的ID沒有範圍的給定的命令可以將其檢索錯誤ID?」

這是通過設計MySQL LAST_INSERT_ID()函數。它不是「特定範圍」的特定陳述。該函數返回的值將爲會話維護。

而mysqli接口爲會話級別的LAST_INSERT_ID()函數提供了一個包裝。

參考:http://php.net/manual/en/mysqli.insert-id.php

至於提供作準備語句的方法/函數,我從來沒有使用的。

我懷疑是在準備好的聲明中,insert_id功能真的是一個封裝/中繼的功能,在會議上(或鏈接,mysqli的是指它。)

如果是這樣的話,這意味着在執行任何其他INSERT語句之前,需要在執行準備語句INSERT後立即調用insert_id

(我真的不知道任何關於這一點。這是可能的mysqli的開發人員實現自動運行,緊跟在準備好的聲明INSERT成功執行的SELECT LAST_INSERT_ID()語句代碼,並且緩存,前執行調用返回值,然後當insert_id函數被調用時,它會返回緩存的值,但我不認爲是這種情況,但它可能是如果是這樣的話,我仍然不會依賴我的代碼我想在INSERT之後立即獲取LAST_INSERT_ID(),然後在MySQL會話中運行任何其他語句之前