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

Rom*_*aza 21 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;

}
Run Code Online (Sandbox Code Playgroud)

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

You*_*nse 26

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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Run Code Online (Sandbox Code Playgroud)

告诉mysqli抛出异常是一种正确的方法.

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

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

  • 这是现在的样子.我问是否有可能指示MySQLi驱动程序抛出异常,就像你使用PDO一样. (3认同)
  • 是的,你的问题很清楚.但是使用包装函数执行查询是一种非常好的做法,一旦你有了这个,就可以添加额外的两行. (2认同)

MrW*_*ite 22

我是否必须检查mysqli_query()是否返回false?

没有.

您应该能够执行您需要的操作并指示mysqli驱动程序在SQL错误上抛出异常,但是MYSQLI_REPORT_ERROR如果它还没有,则需要启用....

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

(注:我改变了$this->SQL对$SQL在重新抛出异常.)