Как превратить этот SQL-запрос в транзакцию PDO без ошибок

0

У меня есть SQL Query:

BEGIN;
INSERT INTO users (username, password)
  VALUES('alpha', 'omega');
INSERT INTO profiles (userid, cv, website) 
  VALUES(LAST_INSERT_ID(),'some cv things', 'www.domain.com');
COMMIT;

И я хочу использовать PDO вместо MYSQL Transcation, чтобы я мог вытащить catched error Поскольку я не получаю ее из транзакции MYSQL, то, что я пробовал,

$dbh->beginTransaction();
try {
 $stmt = $dbh->prepare("
  INSERT INTO users (username, password)
    VALUES('alpha', 'omega');
  INSERT INTO profiles (userid, cv, website) 
    VALUES(LAST_INSERT_ID(),'some cv things', 'www.domain.com');
 ");
 $stmt->execute();
 $dbh->commit();
} catch (PDOException $e) {
 $dbh->rollback();
 throw $e;
}

Но я продолжал получать эту ошибку

Uncaught PDOException: There is no active transaction . . . PDO->rollBack() #1 {main} thrown

В reocrds были INSERT эд в таблицу, но ошибка хранится показывается слишком.

Я попытался использовать $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); но все же получил сообщение об ошибке.

Затем попытался удалить try-catch и сохранить Query с транзакциями PDO и получил это сообщение об ошибке

Uncaught PDOException: There is no active transaction . . . PDO->commit() #1 {main} thrown
  • 0
    @Chris попробовал их обоих, но не работал.
Показать ещё 3 комментария
Теги:
pdo

2 ответа

1
Лучший ответ

вы не передаете какие-либо параметры, сделайте это так:

try {
    $stmt = $dbh->exec('
        INSERT INTO 'users' ('username', 'password')
        VALUES("alpha", "omega");
    ');

    $stmt_2 = $dbh->exec('
         INSERT INTO 'profiles' ('userid', 'cv', 'website') 
         VALUES(LAST_INSERT_ID(), "some cv things", "www.domain.com");
    ');
} catch (PDOException $e) {
    $dbh->rollback();
    throw $e;
}

это выполнит запрос - вам не нужно готовиться, потому что вы уже $dbh->exec своих строк, поэтому простой $dbh->exec выполнит трюк :)

2

Вы throw ИНГ исключение в обработчике ошибок:

catch (PDOException $e) {
 $dbh->rollback();
 throw $e;  // <-- right here
}

Это приведет к тому, что исключение будет продолжаться до тех пор, пока оно не будет обработано, и если оно не будет обработано, это приведет к фатальной ошибке:

Когда генерируется исключение, код, следующий за оператором, не будет выполнен, а PHP попытается найти первый соответствующий блок catch. Если исключение не было обнаружено, Fatal Error будет выдаваться с сообщением "Невыключиться...", если обработчик не был определен с помощью set_exception_handler().

Если обработчик исключений полностью обрабатывает исключение, вы должны удалить эту строку.

  • 0
    Что означает «удален весь try-catch »? Вы удалили эти целые блоки, включая код внутри них, так что все, что осталось от вопроса, это $dbh->beginTransaction(); ? Тогда я не могу вам помочь, потому что я не вижу другого кода.
  • 0
    удалено try{} catch(PDOException $e){throw $e;} внутри ничего нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню