Php PDO事务:如何知道哪些查询导致错误?
我在PHP脚本中使用PDO来执行SQL查询。我想用多个查询执行事务并捕获错误。代码如下所示: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
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();
}