Почему транзакция проскакивает и ничего не меняет?

Код не замысловатый, смена пароля на новый по хешу с почты.
Проблема код проходит до конца выводя что $e = NULL при этом в БД нет никаких изменений, переменная $Changed которая как раз считает количество изменённых строк имеет значение 0.
try {
    $this->Connect->beginTransaction(); // начало транзакции

    $db = $this->Connect->prepare(" UPDATE `users` SET `pwd`=:pwd, `mailh`='' WHERE `mailh`=:hash ");
    $db->bindParam(":pwd",$new_password);
    $db->bindParam(":hash",$hash);
    $db->execute();
    $Changed = $db->rowCount();

    $this->Connect->commit();  // конец транзакции

} catch (\PDOException $e) {
    $this->Connect->rollBack();  // откат транзакции
}
echo $e; // NULL
echo $Changed;  // 0
  • Вопрос задан
  • 240 просмотров
Решения вопроса 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
} catch (\PDOException $e) {
    $this->Connect->rollBack();  // откат транзакции
}
echo $e; // NULL

это пять просто.
php.net/manual/en/language.exceptions.php

Запомните самую главную и важную команду: var_dump
Научитесь пользоваться, будете править миром.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Я же давал в прошлом ответе ссылку на чеклист, в котором написано, как правильно работать с транзакциями.

  1. PDO error reporting надо установить на PDO::ERRMODE_EXCEPTION иначе ловить будет нечего
  2. ловить надо Exception, а не PDOException
  3. после отката исключение надо перевыбросить
  4. убедиться что движок БД поддерживает транзакции (например InnoDB)
  5. среди запросов нет такого, который модифицирует стркутуру БД

Ну и убедись, что в БД у тебя не лежат уже обновленные данные. Потому что в этом случае $Changed законно будет нулем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы