Я работаю над школьным проектом, создающим CMS для моего портфолио. У меня возникли проблемы с работой моей функции обновления. У меня такое чувство, что это связано с тем, как я строю свою PDO Transaction. В моей базе данных есть таблица проектов, таблица категорий и ассоциативная таблица content_category. Я могу просто вставить мои проекты в эти таблицы. То, что я хочу сделать, – это вставить в таблицу моих проектов, а затем удалить все записи из таблицы content_category и, наконец, вставить записи текущей категории в эту ассоциативную таблицу для завершения транзакции. Я получаю возвращаемый оператор return «Project Update». Но таблицы не обновляются. Какие-нибудь идеи?
Вот код:
Это функция в моем классе Project.
public function update(){ try { $conn = getConnection(); $conn->beginTransaction(); $sql = "UPDATE project SET project_title = :title, project_description = :desc, project_isFeatured = :feat, project_mainImage = :image WHERE project_id = :id"; $st = $conn->prepare($sql); $st->bindValue(":id", $this->id, PDO::PARAM_INT); $st->bindValue(":title", $this->title, PDO::PARAM_STR); $st->bindValue(":desc", $this->description, PDO::PARAM_STR); $st->bindValue(":feat", $this->isFeatured, PDO::PARAM_BOOL); $st->bindValue(":image", $this->mainImage, PDO::PARAM_INT); $st->execute(); $sql = "DELETE from content_category WHERE content_id = :id"; $st = $conn->prepare($sql); $st->bindValue("id", $this->id, PDO::PARAM_INT); $st->execute(); $sql = "INSERT into content_category (content_id, cat_id) VALUES (?,?)"; $st = $conn->prepare($sql); foreach($this->categories as $key=>$value){ $st->execute(array(intval($projectID), intval($value))); } $conn->commit(); $conn = null; return "Project updated"; } catch(Exception $e) { echo $e->getMessage(); $conn->rollBack(); return "Error... Unable to update!"; } }
Чтобы убедиться, что вы не сталкиваетесь с ошибкой PDO, вы должны настроить отчет об ошибках PDO следующим образом:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
В PDO есть функции, такие как prepare()
которые либо вернут false, либо сбросят PDOException в зависимости от того, какой режим ошибки установлен. Таким образом, это вызовет исключение, и вы обязательно узнаете, есть ли у вас проблемы!
Кроме того, если ваша база данных не поддерживает транзакции (например, MyISAM), beginTransaction()
вернет значение false. Итак, возможно, добавьте чек, например:
if($conn->beginTransaction()) { // Do transaction here } else { echo("Unable to use transactions with this database."); }
Как ни странно, согласно документации PHP , вы получите исключение, если ваша база данных не поддерживает транзакции …
К сожалению, не каждая база данных поддерживает транзакции, поэтому PDO необходимо запустить в так называемом режиме автоматической фиксации при первом открытии соединения. Режим автоматической фиксации означает, что каждый запрос, который вы запускаете, имеет свою собственную неявную транзакцию, если база данных поддерживает ее, или нет транзакции, если база данных не поддерживает транзакции. Если вам нужна транзакция, вы должны использовать метод PDO :: beginTransaction (), чтобы инициировать ее. Если базовый драйвер не поддерживает транзакции, генерируется исключение PDOException (независимо от настроек обработки ошибок: это всегда является серьезным условием ошибки) .
Ваш механизм базы данных для таблиц должен быть INNODB. Если вы используете phpMyAdmin, по умолчанию используется MyISAM. (Я не знаю, приведет ли это к тому, что обновления не пройдут или просто не будет проигнорирована строка транзакции. Редактирование: Довольно уверен, что в документации говорится, что она выкинет ошибку и ничего не предпримет, если вы начнетеTransaction на myISAM)
Commit возвращает TRUE при успешном завершении или FALSE при сбое. Вы можете проверить это. Также проверьте errorCode .