Можно ли использовать 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

0

Решение

Ответ

Все вроде нормально. Попробуйте добавить SELECT LAST_INSERT_ID() после разблокировки. Я не знаю, почему PDO не работает для вас.

Версия MySQL: 5.5.44

Посмотрите на другой ответ: MySQL и PDO: теоретически PDO :: lastInsertId может дать сбой?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]