如何获取在 PHP 中发生异常之前执行的最后一个 mysqli 查询?
How do I get the last mysqli query executed before an exception occurs in PHP?
下面是一些示例代码:
try
{
$db->query($sql_q1);
$db->query($sql_q2);
$db->query($sql_q3);
}
catch (Exception $e)
{
echo $e->getMessage();
}
如何查看哪个查询导致了 catch
中的错误,以便我可以在错误消息中看到它?行号对我不起作用,因为我的查询通常是动态构建的。
如果您想知道先前执行的查询,一个可能的解决方案是将您的 SQL 存储在一个变量中并为每个语句更改它。然后,如果查询发生错误,您只需回显变量的内容即可。除非有特定原因,否则您需要有多个变量来保存您的查询。
嗯,首先,就像乌斯曼穆尼尔说的,如果你不抓住它,信息会比你抓住更多。只需尝试从您的代码中删除 try..catch
内容,您就会看到查询的前 15 个字符。
但是如果你需要整个查询,有一种方法,虽然它不会马上给你,就像一个指定的变量,它专门包含 "last executed query",但从技术上讲你 可以
有一种叫做 堆栈跟踪 的东西,用于确切的目的。它可以向您显示代码中导致错误的所有调用,包括所有函数参数。
将您的代码更改为此
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);
}
并且您会看到您的查询充满光彩,但如果这是您的目标,自动获取实际查询将是一件很痛苦的事情。但是如果你只想 log/visually 检查错误信息,它就可以了。
显然你不应该在任何现实生活中的代码中将 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 posted a link(顺便说一下我写的)中找到此类文件的示例。
请注意,堆栈跟踪往往会变得 非常 大,并且可能会严重破坏您的日志。因此,请考虑将扩展输出设为可选。
下面是一些示例代码:
try
{
$db->query($sql_q1);
$db->query($sql_q2);
$db->query($sql_q3);
}
catch (Exception $e)
{
echo $e->getMessage();
}
如何查看哪个查询导致了 catch
中的错误,以便我可以在错误消息中看到它?行号对我不起作用,因为我的查询通常是动态构建的。
如果您想知道先前执行的查询,一个可能的解决方案是将您的 SQL 存储在一个变量中并为每个语句更改它。然后,如果查询发生错误,您只需回显变量的内容即可。除非有特定原因,否则您需要有多个变量来保存您的查询。
嗯,首先,就像乌斯曼穆尼尔说的,如果你不抓住它,信息会比你抓住更多。只需尝试从您的代码中删除 try..catch
内容,您就会看到查询的前 15 个字符。
但是如果你需要整个查询,有一种方法,虽然它不会马上给你,就像一个指定的变量,它专门包含 "last executed query",但从技术上讲你 可以
有一种叫做 堆栈跟踪 的东西,用于确切的目的。它可以向您显示代码中导致错误的所有调用,包括所有函数参数。
将您的代码更改为此
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);
}
并且您会看到您的查询充满光彩,但如果这是您的目标,自动获取实际查询将是一件很痛苦的事情。但是如果你只想 log/visually 检查错误信息,它就可以了。
显然你不应该在任何现实生活中的代码中将 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 posted a link(顺便说一下我写的)中找到此类文件的示例。
请注意,堆栈跟踪往往会变得 非常 大,并且可能会严重破坏您的日志。因此,请考虑将扩展输出设为可选。