簡體   English   中英

使用PDO獲取最后插入的行ID(不合適的結果)

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

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