0

我在 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 错误处理的问题)。

4

2 回答 2

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

于 2013-05-24T10:09:33.633 回答
0

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

于 2018-04-06T18:49:47.913 回答