将查询错误转换为MySQLi中的exception

我试图将MySQLi查询错误,以exception,但不能 – 只有当它连接数据库失败时才会引发mysqli_sql_exception 。

我使用mysqli_report(MYSQLI_REPORT_STRICT)和程序化的MySQLi函数embedded到自定义包装类中。

前代码:

 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; } 

问题:这是正常的没有警告,也不会引发exception查询失败,所以我必须检查,如果mysqli_query()返回false?

前段时间,我设法把这个问题排除在外。 正如在另一个答复中指出的那样,

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

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

但是,如果你正在将mysqli函数包装在你自己的包装中(就像每个人都应该这样做) – 它没有太大的区别。 无论哪种方式,你将需要添加一个代码来检查成功 – 无论是ifcatch 。 但是通话的次数是非常有限的,所以不会有太大的麻烦。

但是所有这些由于所有的移动热潮(但是离开方法相同,并且在代码中具有mysqlifunction)从mysql移动到mysqli的人将会从这个设置中大大受益(如果他们不遵循将每个函数调用包装成try-catch的常见习惯,这将是无用的)。

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

没有。

你应该能够做你所需要的,并指示mysqli驱动程序抛出SQL错误的exception,但是如果它不是已经存在,你将需要启用MYSQLI_REPORT_ERROR

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 

mysqli_query()现在应该抛出exception。 您不需要检查失败的返回值(由于抛出exception,这不会发生)。

 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; } 

(注意:在重新抛出的exception中,我将$this->SQL更改$this->SQL $SQL 。)

我知道这太迟了,但为了后代。 我发现MYSQLI_REPORT_STRICT是限制性的,某些exception不会被引发,因此它们不能被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(); }