PDO事务:如何知道哪些查询导致错误?

时间:2013-05-24 09:57:47

标签: php database exception pdo transactions

我在PHP脚本中使用PDO来执行SQL查询。我想要使​​用多个查询执行事务并捕获错误。代码是这样的:

try
{
    $dbh = new PDO(...);
    $dbh-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch
{
    ...
}

$query1 = 'DO some QUERY';
$query2 = 'DO other QUERY';

try
{
    $dbh->beginTransaction();
    $dbh->exec($query1);
    $dbh->exec($query2);
    $dbh->commit();
}
catch
{
    ...
}

我如何知道哪个查询导致错误?我想这样做是因为我想忽略第一个查询的重复键错误而不是第二个查询,而不使用SELECT(另请参阅a previous question of mine关于UNIQUE错误处理)。

2 个答案:

答案 0 :(得分:0)

try
{
    $dbh->beginTransaction();

    try
    {
       $dbh->exec($query1);
    }
    catch (PDOException $e)
    {
        throw new MyNewExtendedPdoException('first query exception'); // or just simply rollback + message
    }

    try
    {
        $dbh->exec($query2);
    }
    catch(PDOException $e)
    {
        throw new MyNewExtendedPdoException('2nd query exception');// or just simply rollback + message
    }

    $dbh->commit();
}
catch (MyNewExtendedPdoException $ex)
{
   $dbh->rollBack();
   echo $ex->getMessage();
}

它可以通过这种方式之一的各种方式完成。您不必创建自己的异常类,您可以在每个try catch {}块中回滚事务,然后它会更简单。

答案 1 :(得分:0)

如果您只运行一些查询 - SQL错误通常会告诉您错误是什么(如果您使用$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);。我使用的解决方案是创建一个包含所有查询的数组,然后输出它们在回滚部分 - 从错误消息和错误所在的查询中可以看出这一点。如果你有大量或大量的查询,那么这可能会有点多。