在 MySQLi 中将查询错误转换为异常

2022-08-30 15:10:29

我正在尝试将MySQLi查询错误转换为异常,但无法 - 仅当连接数据库失败时才会引发mysqli_sql_exception

我使用并处理嵌入到自定义包装类中的MySQLi函数。mysqli_report(MYSQLI_REPORT_STRICT)

旧代码:

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。虽然99%的错误不应该就地处理,而应该由站点范围的错误处理程序来处理。您可以从我关于PHP错误报告的文章中阅读有关该主题的更多信息


答案 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


推荐