2015-09-21 84 views
0

這個問題對我來說同樣重要。有沒有人有辦法解決嗎?當表被鎖定時,是否可以使用PDO lastInsertId()?

$conn = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', '********'); 

$conn->exec('CREATE TABLE testIncrement ' . 
      '(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))'); 
$sth = $conn->prepare('INSERT INTO testIncrement (name) VALUES (:name);'); 
$sth->execute([':name' => 'foo']); 
var_dump($conn->lastInsertId()); 

輸出是:字符串(1) 「lastInsertId」。 但是,當我鎖表,然後lastInsertId始終是0 所以這個代碼總是返回0:

$conn = new PDO('mysql:dbname=test;host=127.0.0.1', 'root', 'paragraf'); 

$conn->exec('CREATE TABLE testIncrement ' . 
      '(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50))'); 
$sth = $conn->prepare('LOCK TABLE testIncrement WRITE; INSERT INTO testIncrement (name) VALUES (:name); UNLOCK TABLES;'); 
$sth->execute([':name' => 'foo']); 
var_dump($conn->lastInsertId()); 

結論:這是可能的,當表被鎖定如何讓lastInsertId?還是我在某個地方錯了?

@Ernestas 我想你的建議,這裏是結果:(

代碼:

$sthLastId = $conn->prepare('SELECT LAST_INSERT_ID();'); 
$sthLastId->execute(); 
print_r($sthLastId->fetchAll()); 

//Output when there is no lock: **string(2) "40" Array ([0] => Array ([LAST_INSERT_ID()] => 40 [0] => 40))** 
//And output when lock is use: **string(1) "0" Array ()** 

MySQL版本:26年6月5日

+0

I * *覺得你的語句根本不會執行。你在一個'prepare'中發出了多個查詢。檢查你的'$ sth-> execute();'的結果,如果它是假的 - 它表示失敗。另外,您確定需要手動控制鎖定和解鎖嗎? – Mjh

+0

它執行。我檢查:( 是的,我敢肯定,因爲這裏有更復雜的查詢,這只是一個例子。) –

+0

要顯示PDO錯誤處理是多重語句有多糟糕,請參閱[questions/32690361 - 有趣的錯誤處理( (http://pastebin.com/fcBQAtxA),它一直報告成功,它顯示實際發送到mysql服務器和PDO執行結果的內容 –

回答

0

Answer

一切似乎罰款在解鎖後嘗試添加SELECT LAST_INSERT_ID()我不知道爲什麼PD O不適合你。

MySQL版本:44年5月5日

查找到不同的答案:MySQL and PDO: Could PDO::lastInsertId theoretically fail?

+0

我試過,同樣的問題:( –

+0

你是否得到任何錯誤?異常?你有沒有直接在sql server中嘗試過?或者只在PHP中? –

+0

不,沒有錯誤或異常我試着在sql server和SELECT_LAST_INSERT_ID中工作得很好,問題在於PDO顯然。它現在但沒有運氣。你是否嘗試像我一樣重現問題,也許我的MySQL服務器有問題或PHP? –

相關問題