[英]getting last inserted row id with PDO (not suitable result)
我對PDO::lastInsertId()
方法有問題,該方法不返回最后插入的行的ID(主鍵),而是返回另一個字段,即外鍵字段。
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
它應該返回1
而不是19
。 我不知道我的代碼有什么問題..也許這是正常現象:?
返回值(PHP文檔):
如果沒有為name參數指定序列名稱,則PDO::lastInsertId()
返回一個字符串,該字符串表示插入數據庫的最后一行的行ID
。
如果為name參數指定了序列名稱,則PDO::lastInsertId()
返回一個字符串,該字符串表示從指定序列對象中檢索到的最后一個值。
如果PDO
驅動程序不支持此功能,則PDO::lastInsertId()
會觸發IM001 SQLSTATE
。
運行"SELECT LAST_INSERT_ID()"
查詢。
如果返回的ID仍為19,而不是2(或在嘗試后應使用任何主鍵),則MySQL存在問題,與PDO無關。 您必須將其作為一個單獨的案例進行研究(並且可能要單獨回答一個問題),提供完整的SQL證明代碼,能夠在控制台中運行,包括創建表,運行插入並選擇LAST_INSERT_ID()
如果此函數返回正確的值,但PDO仍然是錯誤的-您可能必須在bugs.php.net上對其進行bug報告,再次使用完整的可復制代碼和所有提供了確切版本號的軟件名稱。
只有一件事要弄清楚:您是否確定問題中的$sql
變量包含正確的INSERT語句,而不是諸如INSERT ON DUPLICATE之類的東西? 還是在此INSERT上設置了任何觸發器?
我最近查看了PDO :: lastInsertId(),但發現手冊中的描述不足以令人信服(或確實可以理解),因此選擇改用如下形式:
...
$stmt->execute();
$row = $stmt->fetch();
...
這似乎對我有用。
我不是PDO或MySQL專家,所以這可能不太正確,但是我還認為上述方法可以避免在該線程的兩個線程之間(通過不同的用戶/線程)將另一行插入數據庫的可能問題。 execute()和lastInsertID()調用。
如果您想保留lastInsertID(),是否已調查在您的設置中返回的ID是否必須為自動遞增字段? 手動提示應該是這樣,但是是沒有希望的含糊(恕我直言)。
希望對您有所幫助。
干杯,伊恩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.