Home  >  Q&A  >  body text

In MySQLi, convert query errors into exceptions

<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>
P粉060528326P粉060528326394 days ago465

reply all(2)I'll reply

  • P粉420958692

    P粉4209586922023-08-25 10:43:00

    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_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

    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).

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

    (Note: I changed $this->SQL to $SQL in the rethrown exception.)

    reply
    0
  • P粉549412038

    P粉5494120382023-08-25 00:06:47

    Some time ago I successfully solved this problem. As pointed out in other answers,

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    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.

    reply
    0
  • Cancelreply