In MySQLi, convert query errors into exceptions
P粉060528326
2023-08-24 11:53:00
<p>I'm trying to convert MySQLi query errors into exceptions, but it's not possible - the mysqli_sql_exception exception is only thrown when connecting to the database fails. </p>
<p>I used <code>mysqli_report(MYSQLI_REPORT_STRICT)</code> with a procedural MySQLi function embedded in a custom wrapper class. </p>
<p><strong>Previous code: </strong></p>
<pre class="brush:php;toolbar:false;">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;
}</pre>
<p><strong>Question: </strong>No warning or exception is thrown when a query fails, is this normal? So I have to check if mysqli_query() returns false? </p>
No.
You should be able to follow your requirements and instruct the mysqli driver to throw an exception on SQL errors, but you will need to enable
MYSQLI_REPORT_ERROR
if it is not already enabled....mysqli_query()
Should now throw an exception on error. You don't need to check the return value on failure (the exception will be thrown anyway).(Note: I changed
$this->SQL
to$SQL
in the rethrown exception.)Some time ago I successfully solved this problem. As pointed out in other answers,
is the correct way to tell mysqli to throw an exception.
Just make sure not to wrap try-catch in every query. This is a very common misconception, once you start using exceptions you should start throwing try and catch everywhere. In contrast, try-catch should be used with caution. Although 99% of errors should not be handled on site but by a site-wide error handler. You can learn more about this topic from my PHP Error Reporting article.