【问题标题】:How do I get the last mysqli query executed before an exception occurs in PHP?如何在 PHP 中发生异常之前执行最后一个 mysqli 查询?
【发布时间】:2020-09-22 20:57:24
【问题描述】:

这里是一些示例代码:

try
{
   $db->query($sql_q1);
   $db->query($sql_q2);
   $db->query($sql_q3);
}
catch (Exception $e) 
{
   echo $e->getMessage();
}

如何查看导致catch 中的错误的查询,以便我可以看到它以及错误消息?而且行号对我不起作用,因为我的查询通常是动态构建的。

【问题讨论】:

  • 你标记为 mysqli,所以你看过手册了吗?什么没有按照你想要的方式工作?你没说。
  • 现在它只显示错误消息,而不是导致错误本身的实际 SQL。有时错误消息没有包含足够的信息让我解决问题。
  • $db->error 怎么样?里面的信息不够吗?
  • 不,这是同一条消息。

标签: php mysql exception mysqli try-catch


【解决方案1】:

嗯,首先,就像乌斯曼·穆尼尔说的,如果你不抓到它,那么信息会比你抓到的多。只需尝试从您的代码中删除 try..catch 内容,您就会看到查询的前 15 个字符。

但是,如果您需要整个查询,有一种方法,虽然它不会立即给您,例如指定变量,其中包含专门的“最后执行的查询”,但从技术上讲,您可以

有一个叫做堆栈跟踪的东西,专门用于确切目的。它可以显示代码中导致错误的所有调用,包括所有函数参数。

把你的代码改成这个

try
{
   $db->query($sql_q1);
   $db->query($sql_q2);
   $db->query($sql_q3);
}
catch (Exception $e) 
{
   var_dump($e->getTrace());
   // or to get the full error info, just
   var_dump($e);
}

您将看到您的查询的全部荣耀,但如果这是您的目标,自动获取实际查询将是相当痛苦的。但如果您只想记录/目视检查错误信息,它就可以了。

显然你不应该在任何实际代码中将 var_dump() 放在 try_catch() 中。相反,必须将一些处理代码放入您的错误处理程序。特别是如果您的目的是调试。因此,您的现实生活中的代码应该是这样的

// somewhere in the bootstrap
include 'error_handler.php';

// anywhere in your code
$db->query($sql_q1);
$db->query($sql_q2);
$db->query($sql_q3);

在error_handler.php 中,您可以添加代码来打印完整的堆栈跟踪。您可以在文章 Usman Munir 发布的链接中找到此类文件的示例(我顺便写了该链接)。

请注意,堆栈跟踪往往会真正变大,并且可能会大量乱扔您的日志。因此,请考虑将扩展输出设为可选。

【讨论】:

  • 谢谢你,我会听从你的建议的。对于目前的调试,我只是使用$last_query = json_encode($e->getTrace()); 在发生错误时将日志存储在 JSON 表类型中的 MySQL 数据库中。我将继续改进我的错误处理。
【解决方案2】:

如果您想了解先前执行的查询,一个可能的解决方案是将您的 SQL 存储在单个变量中并为每个语句更改它。然后,如果查询发生错误,您可以回显变量的内容。除非有特定原因,您需要使用多个变量来保存查询。

【讨论】:

  • 我想过,但是我需要不同的,抱歉。
猜你喜欢
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多