Я пишу пользовательский ввод в 2 таблицы MySQL следующим образом:
(a) вставить некоторые данные в таблицу-A,
(b) получить lastInsertId,
(c) вставить другие данные в таблицу-B.
Я имею:
$this->conn->beginTransaction();
$stmt = $this->conn->prepare("
INSERT INTO requests
($creation_date, etc...) // some data
VALUES(:creation_date, etc..);"); // some values
$stmt->bindparam(":creation_date",$creation_date);
...
$stmt->execute();
На данный момент, в конечном счете, мне нужно только получить lastInsertId, но, похоже, он становится доступным только после первого $stmt->execute()
поскольку в противном случае он возвращает 0 из-за того, что определенные действия в транзакции не были физически запущены ( пожалуйста, подтвердите, если в противном случае).
Дальнейший код:
$lastInsertId = $this->conn->lastInsertId();
$stmt = $this->conn->prepare("
INSERT INTO other_requests
(requests_id,...) // some more data
VALUES(:requests_id,...);"); // some more values
$stmt->bindparam(":requests_id", $lastInsertId);
$stmt->bindparam(...); // some more bindings
$stmt->execute();
$this->conn->commit();
Вопросы:
Меня беспокоит, если первый $stmt->execute();
в середине кода транзакции каким-то образом прерывает транзакцию. Я понимаю, что он не должен, но до сих пор не нашел никаких хороших доказательств этому.
Я ищу более элегантное решение, поскольку в настоящее время кажется, что слишком много кода для простой задачи.
Спасибо за любые советы
Выполняет ли выполнение транзакции PDO?
Нет.
execute() - выполнить запрос. без execute() ваш запрос не будет выполнен. Если запрос не выполняется, информация не будет храниться в базе данных. Без информации, хранящейся в базе данных, никакая транзакция никогда не будет иметь смысла. Следовательно, чтобы иметь транзакцию, вам необходимо сохранить данные в базе данных. Чтобы сохранить данные в базе данных, вы должны выполнить запрос. Чтобы выполнить запрос, вы должны вызвать execute().
Надеюсь, теперь все ясно.