将查询错误转变为 MySQLi 中的异常[重复]

问题描述 投票:0回答:3

我试图将 MySQLi 查询错误转换为异常,但无法 - 仅当连接数据库失败时才会抛出 mysqli_sql_exception

我使用了

mysqli_report(MYSQLI_REPORT_STRICT)
和嵌入到自定义包装类中的过程 MySQLi 函数。

原代码:

    $this->Result = mysqli_query($this->DBlink, $SQL);
    if($this->Result === false)
        throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));

问题: 查询失败时没有警告,也没有抛出异常,所以我必须检查 mysqli_query() 是否返回 false,这是否正常?

php mysqli
3个回答
45
投票

前段时间我设法解决了这个问题。正如在其他答案中指出的那样,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

是告诉 mysqli 抛出异常的正确方法。

只要确保不要将每个查询都包装在 try-catch 中。这是一个非常常见的误解,即一旦开始使用异常,就应该开始左右抛出尝试和捕获。恰恰相反,应该谨慎使用 try-catch。虽然 99% 的错误不应该就地处理,而应该由站点范围的错误处理程序处理。您可以从我关于 PHP 错误报告

的文章中阅读有关该主题的更多信息

28
投票

我是否必须检查 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
。)


4
投票

我知道有点太晚了,但为了子孙后代。我发现 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();
 }  
© www.soinside.com 2019 - 2024. All rights reserved.