2013-01-14 50 views
2

我有一個PDO::lastInsertId()方法沒有返回最後插入行的id(主鍵),而是返回另一個字段,這是一個外鍵字段的問題。獲取最後插入的行ID與PDO(不合適的結果)

PHP代碼:

$pdo = new PDO(...); 
$stmt = $pdo->prepare($sql); 
$stmt->bindParam(...); 
$stmt->bindParam(...); 
$stmt->execute(); 
$id = $pdo->lastInsertId(); 
// or 
$id = $pdo->lastInsertId('services_id_seq'); // I think 'services_id_seq' is not necessary in MySQL 
// both of them don't return the primary key of last inserted row 

echo 'last inserted id: ' . $id; 

MySQL表結構:

... 
id   int unsigned not null primary key auto_increment 
customer_id int unsigned not null 
user_id  int unsigned not null 
.... 

插入行中的MySQL:

id customer_id user_id ... 
1  19    31   ... 

PHP輸出:

last inserted id: 19 

它應該返回119。我不知道我的代碼是否有問題,或者這可能是正常的行爲:?

返回值(PHP文件):

  • 如果不是因爲名稱參數指定的序列名, PDO::lastInsertId()返回表示插入該行的 最後一行ID字符串數據庫。

  • 如果爲name參數指定了序列名稱,則PDO::lastInsertId()將返回一個字符串,該字符串表示從指定的序列對象中檢索到的最後一個值。

  • 如果PDO驅動程序不支持此功能,PDO::lastInsertId()會觸發IM001 SQLSTATE

+0

要獲得序列並不那麼容易。 http://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id#answer-2944335 – GreenRover

+0

@GreenRover謝謝,它也是postgresql :(我正在使用MySQL,我想知道的是'PDO :: lastInsertId()'正確的方式或不是?或者我犯了一個錯誤 –

+0

我的模式我只紅色的順序而不是thetag。對於MySQL它看起來正確'$ id = $ pdo-> lastInsertId();'你插入也許它是無效的,你會得到最後一次插入的結果。 – GreenRover

回答

-1

我看着PDO :: lastInsertId()最近卻發現手冊中的描述不夠說服力(或實際上可理解),因此選擇了用這樣的事情,而不是:

... 
$stmt->execute(); 
$row = $stmt->fetch(); 
... 

這似乎爲我工作。

我不是PDO或MySQL專家,所以這可能不太正確,但我也認爲上述方法可以規避另一行插入數據庫(由不同的用戶/線程)可能出現的問題,在這個線程的execute()和lastInsertID()調用之間。

如果您希望保持lastInsertID()是否調查過,在您的設置中,返回的ID是否必須是自動遞增字段?手動排序的提示,這應該是如此,但毫無希望模糊(恕我直言)。

希望這有些幫助。

乾杯,伊恩。

+0

@lan thanx。yes是'auto_increment',我編輯了我的問題並添加了mysql表結構 –

1

運行"SELECT LAST_INSERT_ID()"查詢。
如果返回的ID仍然是19,而不是2(或者所有嘗試後的主鍵),那麼MySQL存在與PDO無關的問題。您必須將其作爲單獨的案例進行調查(並且可能是單獨的問題),提供完整的SQL證明代碼,能夠在控制檯中運行,涉及創建表,運行插入和選擇LAST_INSERT_ID()

如果此函數返回正確的值,但PDO仍然是錯誤的 - 你可能會在bugs.php.net上錯誤地報告它,再次提供完整的可重現代碼和所有提供確切版本號的軟件名稱。

只有一件事要說清楚:你肯定肯定$sql變量在你的問題中包含適當的INSERT語句,而不是像INSERT ON DUPLICATE或類似的東西? 或者是否存在此INSERT上設置的任何觸發器?

+0

它是:'$ sql ='INSERT INTO「services 「(」customer_id「,」user_id「,...)VALUES(:customer_id,:user_id,...)';其他字段只是varchars和datetime類型列,也沒有觸發器集。你的解決方案 –