27

我正在尝试将 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?

4

3 回答 3

35

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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

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

于 2013-01-29T08:37:08.263 回答
27

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

于 2014-01-10T15:40:17.753 回答
1

我知道这有点太晚了,但为了后代。我发现 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();
 }  
于 2015-03-10T13:58:09.380 回答