這個問題對我來說同樣重要。有沒有人有辦法解決嗎?當表被鎖定時,是否可以使用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日
I * *覺得你的語句根本不會執行。你在一個'prepare'中發出了多個查詢。檢查你的'$ sth-> execute();'的結果,如果它是假的 - 它表示失敗。另外,您確定需要手動控制鎖定和解鎖嗎? – Mjh
它執行。我檢查:( 是的,我敢肯定,因爲這裏有更復雜的查詢,這只是一個例子。) –
要顯示PDO錯誤處理是多重語句有多糟糕,請參閱[questions/32690361 - 有趣的錯誤處理( (http://pastebin.com/fcBQAtxA),它一直報告成功,它顯示實際發送到mysql服務器和PDO執行結果的內容 –