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

时间:2013-01-29 08:06:22

标签: php mysqli

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

3 个答案:

答案 0 :(得分:23)

前段时间我设法解决了这个问题。正如other answer中指出的那样,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

但是,如果你在自己的包装器中包装mysqli函数(就像每个人都应该这样!) - 它没有太大的区别。无论哪种方式,您都需要添加代码来检查是否成功 - 无论是if还是catch。然而,呼叫次数非常有限,所以不会太麻烦。

但是所有这些因为所有运动热潮而从mysql“移动”到mysqli的人(但是让方法保持相同并且在整个代码中都具有mysqli功能)将从这个设置中受益匪浅(如果他们赢了'遵循将每个函数调用包装到try-catch中的常见习惯,这将是无用的。)

答案 1 :(得分:20)

  

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

答案 2 :(得分:0)

我知道这有点太晚了,但为了后人的缘故。我发现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();
 }