2013-08-29 2 views
3

Я тяну волосы на этом.Как получить последнюю сгенерированную ошибку в MySQL из DB Adapter

В ZF1 это было легко, так как это привело бы к возникновению исключения с полными данными об ошибках sql. В ZF2 он вызывает только Exception \ RuntimeException, который передает только описание ошибки, а не число, из-за которого невозможно работать.

Вопрос: как получить полную ошибку из адаптера. Вот фрагмент кода, который я использую:

$dbAdapter = $this->_serviceManaget->get('Zend\Db\Adapter\Adapter'); 

try { 
    $result = $dbAdapter->query($sql, $binds); 
} catch (\Exception $e) { 
    //here I need to check the error number raised by MySQL during the execution 
    //$e object in this case only contains 
    //$e->message = "Duplicate entry 'blablabla' for key 319" and $e->code = 0 
} 

Любые предложения?

ответ

2

В ZF2 Исключения распространяются от PHP SPL Exceptions. Все они расширяют стандартный интерфейс Exception. После Exception manual вы можете сделать это:

try { 
    $result = $dbAdapter->query($sql, $binds); 
} catch (\Exception $e) {   
    $code = $e->getCode(); 
    $msg = $e->getMessage(); 
    $file = $e->getFile(); 
    $line = $e->getLine(); 
    echo "$file:$line ERRNO:$code ERROR:$msg";  
} 

FYI вы можете реализовать несколько уловов для различных типов исключений, как это:

try { 
    ... 
} catch (\RuntimeException $e) { 
    ... 
} catch (\LogicException $e) { 
    ... 
} 

Обновление:
Для получения данных об ошибках непосредственно из \mysqli Например:

try { 
    $result = $dbAdapter->query($sql, $binds); 
} catch (\Exception $e) { 
    $mysqli = $dbAdapter->getDriver()->getConnection()->getResource();   
    $file = $e->getFile(); 
    $line = $e->getLine(); 
    echo "$file:$line ERRNO:$mysqli->errno ERROR:$mysqli->error";  
} 

Для получения дополнительной информации о том, как получить \mysqli ошибки и предупреждения данные проверки manual.

+0

Спасибо за ответ, но, пожалуйста, внимательно прочитайте описание и код. Это означает, что code = "0" и message = "Дублировать запись" blablabla "для ключа 319". Итак, чтобы перефразировать, мне нужно каким-то образом вывести объект MySQLi из адаптера, чтобы вытащить из него «последнюю ошибку, вызванную DB». – user2033934

+0

@ user2033934 обновил мой ответ. Надеюсь это поможет. –

+0

Спасибо, работает на этот раз – user2033934

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