2015-09-21 3 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 версии: 5.6.26

+0

* Я думаю * Ваше утверждение не выполняется. Вы выдали несколько запросов в одном «приготовлении». Проверьте результат вашего '$ sth-> execute();', если он ложный - это указывает на сбой. Кроме того, вы уверены, что вам нужно управлять блокировкой и разблокировкой вручную? – Mjh

+0

Его исполнение. Я проверил :( Да, я уверен, потому что это более сложный запрос, это просто пример. –

+0

Чтобы показать, насколько ужасно, что обработка ошибок PDO с несколькими операторами см. В разделе [вопросы/32690361 - интересная обработка ошибок (pastebin)] (http://pastebin.com/fcBQAtxA). Он сообщает, что он всегда преуспевает. Он показывает, что фактически отправлено на сервер mysql и результат выполнения PDO. –

ответ

0

Answer

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

версия MySQL: 5.5.44

Посмотрите на другой ответ: MySQL and PDO: Could PDO::lastInsertId theoretically fail?

+0

Я пробовал такую ​​же проблему :( –

+0

У вас есть получить исключение? Исключение? Вы пытались напрямую в sql-сервере? Или только в PHP? –

+0

Нет, нет ошибки или исключения. Я пробовал на сервере sql, и SELECT_LAST_INSERT_ID работает отлично. Проблема в PDO, по-видимому. теперь вам не повезло. Вы пытались воспроизвести проблему точно так, как я, возможно, у моего сервера mysql есть проблема или php? –