Все запросы выполняются успешно, когда я проверяю таблицу в строке 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();