У меня есть 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
вы не передаете какие-либо параметры, сделайте это так:
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
выполнит трюк :)
Вы throw
ИНГ исключение в обработчике ошибок:
catch (PDOException $e) {
$dbh->rollback();
throw $e; // <-- right here
}
Это приведет к тому, что исключение будет продолжаться до тех пор, пока оно не будет обработано, и если оно не будет обработано, это приведет к фатальной ошибке:
Когда генерируется исключение, код, следующий за оператором, не будет выполнен, а PHP попытается найти первый соответствующий блок catch. Если исключение не было обнаружено, Fatal Error будет выдаваться с сообщением "Невыключиться...", если обработчик не был определен с помощью set_exception_handler().
Если обработчик исключений полностью обрабатывает исключение, вы должны удалить эту строку.
try-catch
»? Вы удалили эти целые блоки, включая код внутри них, так что все, что осталось от вопроса, это $dbh->beginTransaction();
? Тогда я не могу вам помочь, потому что я не вижу другого кода.
try{} catch(PDOException $e){throw $e;}
внутри ничего нет.