Подтвердить что ты не робот

Превращение ошибок запроса в Исключения в MySQLi

Я пытаюсь превратить ошибки запросов MySQLi в Exceptions, но не смог - mysqli_sql_exception вызывается только в том случае, если ему не удалось подключить БД.

Я использовал mysqli_report(MYSQLI_REPORT_STRICT) и процедурные функции MySQLi, встроенные в класс пользовательских оболочек.

Бывший код:

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;

}

Вопрос: Нормально ли не предупреждение или исключение возникает при сбое запроса, поэтому мне нужно проверить, вернётся ли mysqli_query() false?

4b9b3361

Ответ 1

Некоторое время назад мне удалось разобраться в этом вопросе. Как было указано в другом ответе,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

- это правильный способ сказать mysqli для исключения исключений.

Однако, если вы обертываете mysqli-функции в своей собственной оболочке (как и все должны!) - это не делает слишком большой разницы. В любом случае вам нужно будет добавить код для проверки успеха - будь то if или catch. Тем не менее, будет очень ограниченное количество вызовов, поэтому это не вызовет слишком много проблем.

Но все эти люди, которые "перемещаются" из mysql в mysqli из-за всего этого увлечения (но оставляя подход одинаковым и имея функции mysqli по всему коду), извлекут выгоду из этого параметра (если они выиграют) t следует общей привычке обертывать каждый вызов функции в try-catch, что было бы бесполезно).

Ответ 2

Нужно ли проверять, возвращалось ли mysqli_query() false?

Нет.

Вы должны иметь возможность делать то, что вам нужно, и инструктировать драйвер mysqli для исключения исключений из SQL-ошибок, но вам нужно включить MYSQLI_REPORT_ERROR, если он еще не был...

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

mysqli_query() должен теперь генерировать исключения при ошибке. Вам не нужно проверять возвращаемое значение для отказа (что не произойдет в любом случае, поскольку выбрано исключение).

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: я изменил $this->SQL на $SQL в повторном исключении.)

Ответ 3

Я знаю это немного позже, но ради потомства. Я считаю, что MYSQLI_REPORT_STRICT должен быть ограниченным, некоторые исключения, если их не поднимать, и, следовательно, они не могут быть обработаны блоком 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();
 }