我试图将 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,这是否正常?
我是否必须检查 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
。)
我知道有点太晚了,但为了子孙后代。我发现 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();
}