我试图将MySQLi查询错误转换为“异常”,但不能-仅在无法连接数据库时抛出mysqli_sql_exception。
我使用了
mysqli_report(MYSQLI_REPORT_STRICT)
和嵌入到程序中的MySQLi函数自定义包装器类。以前的代码:
public function mysqlQuery($SQL) {
$this->Result = mysqli_query($this->DBlink, $SQL);
if($this->Result === false)
throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));
return $this->Result;
}
问题:是否正常,没有警告,或者查询失败时抛出异常,所以我有检查mysqli_query()是否返回false?
#1 楼
不久前,我设法解决了这个问题。正如在其他答案中指出的那样,mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
是告诉mysqli引发异常的正确方法。
请确保您不要将每个查询都包装在try-catch中。这是一个非常普遍的误解,即一旦您开始使用异常,您就应该开始向左和向右抛出try和catch。恰恰相反,应谨慎使用try-catch。虽然您不应将99%的错误处理到位,而是由整个站点的错误处理程序来处理。您可以从我有关PHP错误报告的文章中阅读有关该主题的更多信息
评论
现在就是这样。我问是否可以指示MySQLi驱动程序引发异常,就像对PDO一样。
–罗马纽瓦萨
13年1月29日在8:38
是的,你的问题很清楚。但是,使用包装函数执行查询是(一种非常好的)实践,一旦有了,就可以轻松地添加额外的两行。
–卡洛莉·霍瓦斯(Karoly Horvath)
13年1月29日在8:42
#2 楼
是否必须检查mysqli_query()是否返回false?
否。
您应该能够执行所需的操作并指示mysqli驱动程序会针对SQL错误引发异常,但如果尚未启用
MYSQLI_REPORT_ERROR
,则需要启用它。...mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
mysqli_query()
现在应针对错误引发异常。您无需检查失败的返回值(因为抛出异常,无论如何都不会发生)。public function mysqlQuery($SQL) {
try {
$this->Result = mysqli_query($this->DBlink, $SQL);
} catch (mysqli_sql_exception $e) {
throw new MySQLiQueryException($SQL, $e->getMessage(), $e->getCode());
}
return $this->Result;
}
(注意:我将
$this->SQL
更改为$SQL
在重新抛出的异常中。)评论
这是否是您正在使用允许使用方法$ e-> getCode()`的mysqli_sql_exception`的事实,并且我想这将反映$ mysqli-> errno?
–路易·路德·多格
17年5月12日下午5:18
@LouisLoudogTrottier是的,getCode()是mysqli_sql_exception对象的方法,因此仅在该异常类型的catch块的范围内可用。
–怀特先生
17年5月12日在9:07
#3 楼
我知道为时已晚,但是为了后代。我发现MYSQLI_REPORT_STRICT是限制性的,某些异常未引发,因此catch块无法处理。 mysqli_report(MYSQLI_REPORT_ALL); // Traps all mysqli error
try {
$mysqli = new mysqli('localhost','user,'pwd','db');
/* I don't need to explicitly throw an exception as this is being
done automatically */
} catch(Exception $e) {
echo $e->getMessage();
}
评论
异常$ e本身会捕获mysqli故障,还是需要使用mysqli_sql_exception $ e?还是等价的?还是由于mysqli_report(MYSQLI_REPORT_ALL);而使用了异常?
–路易·路德·多格
17年5月12日下午5:16
@LouisLogTrottier Exception对象是所有异常的父对象(mysqli_sql_exception是子类),因此它自然会捕获所有异常。
–怀特先生
17年5月12日在9:14
catch(Exception $ e){echo $ e-> getMessage();是一个无用的货物崇拜代码。如果将其取出,结果将是相同的:PHP已经报告了未捕获的异常。
–您的常识
5月5日10:11
评论
据我所知,mysqli仅在数据库连接上才引发异常。所以...差不多,是的。您具有mysqli_errno,mysqli_error和其他函数,因此您知道错误,但这是限制。如果尝试,捕获和抛出错误,则可以抛出异常。
@ k102,我正尝试从我的代码中将其放入MySQLi。
我看到了@VladPreda,像我现在必须保留它那样的接缝。