Этот вопрос снова важен для меня. у кого-нибудь есть решение?Возможно ли использовать 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 версии: 5.6.26
* Я думаю * Ваше утверждение не выполняется. Вы выдали несколько запросов в одном «приготовлении». Проверьте результат вашего '$ sth-> execute();', если он ложный - это указывает на сбой. Кроме того, вы уверены, что вам нужно управлять блокировкой и разблокировкой вручную? – Mjh
Его исполнение. Я проверил :( Да, я уверен, потому что это более сложный запрос, это просто пример. –
Чтобы показать, насколько ужасно, что обработка ошибок PDO с несколькими операторами см. В разделе [вопросы/32690361 - интересная обработка ошибок (pastebin)] (http://pastebin.com/fcBQAtxA). Он сообщает, что он всегда преуспевает. Он показывает, что фактически отправлено на сервер mysql и результат выполнения PDO. –