我有这个SQL查询:
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 Transactions并收到此错误消息
Uncaught PDOException: There is no active transaction . . . PDO->commit() #1 {main} thrown
答案 0 :(得分:2)
您在错误处理程序中throw
了异常:
catch (PDOException $e) {
$dbh->rollback();
throw $e; // <-- right here
}
这将导致异常在处理之前继续运行,并且if it's not handled it will throw a fatal error:
当抛出异常时,语句后面的代码将不会被执行,PHP将尝试查找第一个匹配的catch块。如果未捕获异常,则将发出PHP致命错误,并显示“ Uncaught Exception ... ”消息,除非已使用set_exception_handler()定义了处理程序。
如果异常处理程序完全处理异常,则应删除该行。
答案 1 :(得分: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
可以解决问题:)