Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Turning query errors to Exceptions in MySQLi [duplicate]

Tags:

php

mysqli

I'm trying to turn MySQLi query errors to Exceptions, but couldn't - mysqli_sql_exception is thrown only if it failed to connect the DB.

I used mysqli_report(MYSQLI_REPORT_STRICT) and procedural MySQLi functions embedded to custom wrapper class.

Former code:

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

Question: Is it normal no Warning, nor Exception are thrown when query fails so I have to check if mysqli_query() returned false?

like image 441
Roman Newaza Avatar asked Jan 29 '13 08:01

Roman Newaza


2 Answers

Some time ago I managed to sort this matter out. As it was pointed out in the other answer,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

is a correct way to tell mysqli to throw exceptions.

Just make sure you don't wrap every query in a try-catch. This is a very common misconception that as soon as you started using exceptions you should start throwing tries and catches left and right. Quite contrary, try-catch should be used warily. While 99% of your errors shouldn't be handled in place, but rather by a site-wide error handler. You may read more on the topic from my article on PHP error reporting

like image 182
Your Common Sense Avatar answered Sep 20 '22 15:09

Your Common Sense


do I have to check if mysqli_query() returned false?

No.

You should be able to do what you require and instruct the mysqli driver to throw exceptions on SQL errors, but you will need to enable MYSQLI_REPORT_ERROR if it is not already....

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 

mysqli_query() should now throw exceptions on error. You do not need to check the return value for failure (which won't happen anyway because an exception is thrown).

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

(NB: I changed $this->SQL to $SQL in the re-thrown exception.)

like image 34
MrWhite Avatar answered Sep 16 '22 15:09

MrWhite