pdo lastInsertId возвращает ноль (0)

Все запросы выполняются успешно, когда я проверяю таблицу в строке MySQL, вставленной успешно без каких-либо ошибок, но lastInsertId() возвращает 0 . Зачем?

Мой код:

 // queries executes successfully, but lastInsetId() returns 0 // the menus table has `id` column with primary auto_increment index // why lastInsertId return 0 and doesn't return actual id? $insertMenuQuery = " SELECT @rght:=`rght`+2,@lft:=`rght`+1 FROM `menus` ORDER BY `rght` DESC limit 1; INSERT INTO `menus`(`parent_id`, `title`, `options`, `lang`, `lft`, `rght`) values (:parent_id, :title, :options, :lang, @lft, @rght);"; try { // menu sql query $dbSmt = $db->prepare($insertMenuQuery); // execute sql query $dbSmt->execute($arrayOfParameterOfMenu); // menu id $menuId = $db->lastInsertId(); // return return $menuId; } catch (Exception $e) { throw new ForbiddenException('Database error.' . $e->getMessage()); } 

С PDO_MySQL мы должны использовать

 $DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,TRUE); // there are other ways to set attributes. this is one 

так что мы можем запускать несколько запросов, таких как:

 $foo = $DB->prepare("SELECT * FROM var_lst;INSERT INTO var_lst (value) VALUES ('durjdn')"); 

но, к сожалению, это избавляет $ DB от возвращения правильного идентификатора вставки. Вам придется запускать их отдельно, чтобы получить идентификатор вставки. Это возвращает правильный идентификатор вставки:

 $DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,TRUE); $foo = $DB->prepare("INSERT INTO var_lst (value) VALUES ('durjdn')"); $foo->execute(); echo $DB->lastInsertId(); 

но это не будет:

 $DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,TRUE); $foo = $DB->prepare("SELECT * FROM var_lst;INSERT INTO var_lst (value) VALUES ('durjdn')"); $foo->execute(); echo $DB->lastInsertId(); 

и это не вызовет даже два запроса:

 $DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE); // When false, prepare() returns an error $foo = $DB->prepare("SELECT * FROM var_lst;INSERT INTO var_lst (value) VALUES ('durjdn')"); $foo->execute(); echo $DB->lastInsertId(); 

Поместите $dbh->lastInsertId(); До $dbh->commit() и After $stmt->execute();