我试图将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?

评论

据我所知,mysqli仅在数据库连接上才引发异常。所以...差不多,是的。您具有mysqli_errno,mysqli_error和其他函数,因此您知道错误,但这是限制。

如果尝试,捕获和抛出错误,则可以抛出异常。

@ k102,我正尝试从我的代码中将其放入MySQLi。

我看到了@VladPreda,像我现在必须保留它那样的接缝。

#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