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

Php PDO事务:如何知道哪些查询导致错误?,php,database,exception,pdo,transactions,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->begin

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


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

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

使用两个不同的try-catch块?@user1615903:这就是我想要的现在开始,但我会使用事务来加快查询速度。两个try-catch块如何阻止您使用事务?您可以使用serveral try-catch块并在catch()块中打印消息,然后抛出您自己的异常以在回滚()的另一个块中捕获你的transaction@user1615903:嗯,你是对的……我认为它无法工作,因为我的上一个SQL错误是由execute()引起的。Mmmhh……那么$newe=mynewextendedpodexception($e);$newe.setQueryInfo('first query exception');throw$newe;
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();
}