如何将此SQL查询转换为没有错误的PDO事务

时间:2018-04-06 13:08:57

标签: php mysql pdo

我有这个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

2 个答案:

答案 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可以解决问题:)