2013-07-03 5 views
0

В настоящее время, мой лучший способом обработки ошибок MySQL является добавление этого после каждого тузда заявления:Есть ли способ привязать функцию обработчика событий к ошибкам mysql?

if($mysqli->error) 
errorhandlingfunction(); 

Есть ли способ, чтобы создать тип обработчика ошибок MySQL и назначить функцию каждый раз, когда возникает ошибка вместо того, чтобы вручную проверять каждый раз?

+0

Возможный дубликат [MySQLi обработки ошибок] (http://stackoverflow.com/questions/2932113/mysqli-error-handling) – peterm

ответ

0

Создайте новый класс, который расширяет mysqli и генерирует исключение при возникновении ошибки:

/* Create custom exception classes */ 
class ConnectException extends Exception {} 
class QueryException extends Exception {} 

class Mysqlie extends mysqli 
{ 

    function __construct() 
    { 
    parent::init(); 
    if (!parent::options(MYSQLI_INIT_COMMAND, 'set session sql_mode="strict_all_tables";')) { 
     throw new ConnectException("Cannot set MySQL options"); 
    } 

    $args = func_get_args(); 
    $result = call_user_func_array("parent::real_connect", $args); 
    /* Pass all arguments passed to the constructor on to the parent's constructor */ 
    if (!$result) { 
     throw new ConnectException('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error()); 
    } 

    } 

    function query($query) 
    { 
    $result = parent::query($query); 
    if(mysqli_error($this)){ 
     throw new QueryException(mysqli_error($this), mysqli_errno($this)); 
    } 
    return $result; 
    } 
} 

Тогда ваш код становится:

try { 
    $conn = new mysqlie(...connection parameters...); 
    $result = $conn->query("MyQuery"); 

    // do lots more stuff here 
    // including more queries 
    $result = $conn->query("MyNextQuery"); 

    // finally close... 
    $conn->close(); 


} catch (ConnectException $e)) { 
    die("Can't connect to database".$e->getMessage()); 
} catch (QueryException $e) { 
    die("Query error:".$e->getMessage()); 
} 

Содержание вашего try блока может быть, очевидно, гораздо больше, и включать несколько запросов.

+0

Как я могу добавить функцию для захвата параметризованных операторов? – user1755043

+0

Расширьте класс, чтобы включить методы 'prepare',' bind' и 'execute', которые переопределяют родительские методы. Добавьте новые исключения, аналогичные тем, которые я добавил здесь (ExecuteException, возможно). Ловушка любых ошибок в классе и «бросить» одно из ваших новых исключений. Вы можете добавить столько блоков 'catch', сколько вам нужно, каждый из которых захватывает разные Исключения. –

 Смежные вопросы

  • Нет связанных вопросов^_^