【问题标题】:PDO Transaction: how to know which queries caused an error?PDO Transaction:如何知道哪些查询导致了错误?
【发布时间】:2013-05-19 21:32:48
【问题描述】:

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

【问题讨论】:

  • 使用两个不同的 try-catch 块?
  • @user1615903:这就是我现在正在做的事情,但我会使用事务来加快查询速度。
  • 两个 try-catch 块如何阻止您使用事务?
  • 您可以使用多个 try catch 块并在 catch() 块中打印消息并抛出您自己的异常以在您回滚()事务的另一个块中捕获
  • @user1615903:嗯,你说得对……我想它不能工作,因为我的最后一个 SQL 错误是由 execute() 引起的。

标签: php database exception pdo transactions


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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 {} 块中回滚事务,这样会更简单。

    【讨论】:

    • Mmmhh ... $newe = MyNewExtendedPdoException($e); 怎么样? $newe.setQueryInfo('第一次查询异常');抛出 $newe;
    猜你喜欢
    • 2014-01-16
    • 2022-06-28
    • 2019-07-25
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多