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


PDO Transaction: how to know which queries caused an error?

我在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的情况下忽略第一个查询的重复键错误,而不是第二个查询的重复键错误(参见我之前关于UNIQUE错误处理的问题)。

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{}块中回滚你的事务,这样会更简单。

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