Почему эта транзакция работает неправильно? [закрыто] ⇐ Php
-
Гость
Почему эта транзакция работает неправильно? [закрыто]
У меня есть следующая транзакция внутри функции для ВСТАВКИ нового кредита и в то же время ОБНОВЛЕНИЯ состояния элемента:
публичная функция createLoan($conn) { пытаться { $conn->beginTransaction(); // функция создания нового кредита $this->create($conn); // функция обновления состояния элемента $this->updateItemState($conn, $this->item_id); вернуть $conn->commit(); } catch (PDOException $e) { $conn->rollBack(); эхо «Ошибка:». $e->getMessage(); } } Вот функции create(), updateItemState() и validate():
create():
защищенная функция create($conn) { если ($this->validate($conn)) { $sql = "ВСТАВИТЬ В кредит (идентификатор_элемента, идентификатор_пользователя, дата_отъезда, максимальная_дата_возврата, состояние) ЗНАЧЕНИЯ (:item_id, :user_id, :departure_date, :maximum_return_date, :state)"; $stmt = $conn->prepare($sql); $stmt->bindvalue(":item_id", $this->item_id, PDO::PARAM_INT); $stmt->bindvalue(":user_id", $this->user_id, PDO::PARAM_INT); $stmt->bindvalue(":departure_date", $this->departure_date, PDO::PARAM_STR); $stmt->bindvalue(":maximum_return_date", $this->maximum_return_date, PDO::PARAM_STR); $stmt->bindvalue(":state", 1, PDO::PARAM_INT); если ($stmt->execute()) { $this->id = $conn->lastInsertId(); вернуть истину; } } еще { вернуть ложь; } } updateItemState():
защищенная функция updateItemState($conn, $item_id) { $sql = "ОБНОВИТЬ элемент SET состояние = :состояние ГДЕ id = :id"; $stmt = $conn->prepare($sql); $stmt->bindValue(":state", 2, PDO::PARAM_INT); $stmt->bindValue(":id", $item_id, PDO::PARAM_INT); вернуть $stmt->execute(); } validate():
публичная функция validate($conn) { // проверка элемента если (пустой($this->item_id)) { $this->errors[] = "Поле элемента не должно быть пустым"; } функция itemExistsInDatabase($conn, $item_id) { $sql = "ВЫБРАТЬ идентификатор ИЗ элемента ГДЕ id = :id"; $stmt = $conn->prepare($sql); $stmt->bindValue(":id", $item_id, PDO::PARAM_INT); $stmt->выполнить(); $rows = $stmt->rowCount(); вернуть $строки >= 1; } if (!itemExistsInDatabase($conn, $this->item_id)) { $this->errors[] = "Выбранный элемент не существует в базе данных"; } функция itemIsAvailable($conn, $item_id) { $sql = "ВЫБРАТЬ состояние ИЗ элемента ГДЕ id = :id"; $stmt = $conn->prepare($sql); $stmt->bindValue(":id", $item_id, PDO::PARAM_INT); $stmt->выполнить(); $state = $stmt->fetch(); вернуть $state == 1; } if (!itemIsAvailable($conn, $this->item_id)) { $this->errors[] = "Выбранный элемент недоступен"; } // проверка даты отправления если (пустой($this->departure_date)) { $this->errors[] = "Поле даты отъезда не должно быть пустым"; } // проверка Maximum_return_date если (пустой($this->maximum_return_date)) { $this->errors[] = "Поле максимальной даты возврата не должно быть пустым"; } вернуть пустой ($this->errors); } По какой-то причине, когда я выполняю код, он только обновляет состояние элемента, но не вставляет новый заем.
Итак, мой вопрос: что не так в этом коде, из-за которого транзакция работает неправильно?
У меня есть следующая транзакция внутри функции для ВСТАВКИ нового кредита и в то же время ОБНОВЛЕНИЯ состояния элемента:
публичная функция createLoan($conn) { пытаться { $conn->beginTransaction(); // функция создания нового кредита $this->create($conn); // функция обновления состояния элемента $this->updateItemState($conn, $this->item_id); вернуть $conn->commit(); } catch (PDOException $e) { $conn->rollBack(); эхо «Ошибка:». $e->getMessage(); } } Вот функции create(), updateItemState() и validate():
create():
защищенная функция create($conn) { если ($this->validate($conn)) { $sql = "ВСТАВИТЬ В кредит (идентификатор_элемента, идентификатор_пользователя, дата_отъезда, максимальная_дата_возврата, состояние) ЗНАЧЕНИЯ (:item_id, :user_id, :departure_date, :maximum_return_date, :state)"; $stmt = $conn->prepare($sql); $stmt->bindvalue(":item_id", $this->item_id, PDO::PARAM_INT); $stmt->bindvalue(":user_id", $this->user_id, PDO::PARAM_INT); $stmt->bindvalue(":departure_date", $this->departure_date, PDO::PARAM_STR); $stmt->bindvalue(":maximum_return_date", $this->maximum_return_date, PDO::PARAM_STR); $stmt->bindvalue(":state", 1, PDO::PARAM_INT); если ($stmt->execute()) { $this->id = $conn->lastInsertId(); вернуть истину; } } еще { вернуть ложь; } } updateItemState():
защищенная функция updateItemState($conn, $item_id) { $sql = "ОБНОВИТЬ элемент SET состояние = :состояние ГДЕ id = :id"; $stmt = $conn->prepare($sql); $stmt->bindValue(":state", 2, PDO::PARAM_INT); $stmt->bindValue(":id", $item_id, PDO::PARAM_INT); вернуть $stmt->execute(); } validate():
публичная функция validate($conn) { // проверка элемента если (пустой($this->item_id)) { $this->errors[] = "Поле элемента не должно быть пустым"; } функция itemExistsInDatabase($conn, $item_id) { $sql = "ВЫБРАТЬ идентификатор ИЗ элемента ГДЕ id = :id"; $stmt = $conn->prepare($sql); $stmt->bindValue(":id", $item_id, PDO::PARAM_INT); $stmt->выполнить(); $rows = $stmt->rowCount(); вернуть $строки >= 1; } if (!itemExistsInDatabase($conn, $this->item_id)) { $this->errors[] = "Выбранный элемент не существует в базе данных"; } функция itemIsAvailable($conn, $item_id) { $sql = "ВЫБРАТЬ состояние ИЗ элемента ГДЕ id = :id"; $stmt = $conn->prepare($sql); $stmt->bindValue(":id", $item_id, PDO::PARAM_INT); $stmt->выполнить(); $state = $stmt->fetch(); вернуть $state == 1; } if (!itemIsAvailable($conn, $this->item_id)) { $this->errors[] = "Выбранный элемент недоступен"; } // проверка даты отправления если (пустой($this->departure_date)) { $this->errors[] = "Поле даты отъезда не должно быть пустым"; } // проверка Maximum_return_date если (пустой($this->maximum_return_date)) { $this->errors[] = "Поле максимальной даты возврата не должно быть пустым"; } вернуть пустой ($this->errors); } По какой-то причине, когда я выполняю код, он только обновляет состояние элемента, но не вставляет новый заем.
Итак, мой вопрос: что не так в этом коде, из-за которого транзакция работает неправильно?
Мобильная версия