使用PDO语句执行所有查询,无论是否为任何查询

时间:2014-01-26 09:50:47

标签: php mysql pdo transactions

我需要make 2 mysql查询,我需要在事务中进行此操作

$db->query("START TRANSACTION");
$ins_sth1 = $db->prepare("INSERT INTO t1(val) values('a')");
$ins_sth1->execute();
$error_info1 = $ins_sth1->errorInfo();

if ($error_info1[2] === NULL ) {
    $ins_sth2 = $db->prepare("INSERT INTO t2(val)  values('b')");
    $ins_sth2->execute();
    $error_info2 = $ins_sth2->errorInfo();
}
else {
    echo "First query not executed";
    exit;
}
if ($error_info2[2] === NULL) {
    $db->query("COMMIT");
    echo "All query executed success";
}
else {
    $db->query("ROLLBACK ");
    echo "Second query not executed";
}

有可能查询未执行,但PDO errorInfo会返回NULL值吗?

也就是说,上面代码中的方法是100%可靠还是不可靠?

1 个答案:

答案 0 :(得分:0)

如果PDO遇到错误,它将抛出异常。 因此,如果您想要100%可靠的代码,我建议使用try catch:

try{
    $db->beginTransaction();

    $ins_sth1 = $db->prepare("INSERT INTO t1(val) values('a')");
    $ins_sth1->execute();

    $ins_sth2 = $db->prepare("INSERT INTO t2(val)  values('b')");
    $ins_sth2->execute();

    $db->commit();
}
catch (Exception $e) {
    $db->rollBack();
}

如果您使用的是PDO,则会有内置的交易功能。

而不是

$db->query("ROLLBACK ");

使用

$db->rollBack();

http://www.php.net/manual/en/pdo.transactions.php