将查询错误转换为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函数包装在你自己的包装中(就像每个人都应该这样做) – 它没有太大的区别。 无论哪种方式,你将需要添加一个代码来检查成功 – 无论是if
或catch
。 但是通话的次数是非常有限的,所以不会有太大的麻烦。
但是所有这些由于所有的移动热潮(但是离开方法相同,并且在代码中具有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(); }