2010-08-05 2 views
1

Я использую CodeIgniter в качестве рамки веб-приложения. Я использовал простой Try/Catch, и я отправил пробное значение, чтобы проверить его, и он не сработал!Проблема с обработкой ошибок базы данных в CodeIngniter

Я знаю, что могу использовать функцию $this->db->escape() для решения моей проблемы с данными, но я просто хочу знать: почему TRY/CATCH не может поймать эту ошибку!

Controler код: Код

$this->load->model('user_model'); 
    $result = $this->user_model->test_user("tes'ti"); 

Модель:

function test_user($username){ 
    try { 
     $query_str = "SELECT * FROM tbl_user WHERE username = '".$username."'"; 
     $result = $this->db->query($query_str); 
     return $result; 

    } catch (Exception $e) { 
     return; 

    } 
} 

Выход:

A Database Error Occurred 

Error Number: 1064 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ti'' at line 1 

SELECT * FROM tbl_user WHERE username = 'tes'ti' 

Позвольте мне знать, где я допустил ошибку, если бы я сделал!

Благодарим вас за внимание и помощь другим. ;)

ответ

2

Вы должны бросить исключение, если есть какая-то ошибка MySQL:

try { 
    $query_str = "SELECT * FROM tbl_user WHERE username = '".$username."'"; 
    $result = $this->db->query($query_str); 

    if (!$result) 
    { 
     throw new Exception('error in query'); 
     return false; 
    }   

    return $result; 

} catch (Exception $e) { 
    return; 
} 
+0

Спасибо Sarfraz, я сделал ваши рекомендации, но он снова не сработал! у вас больше идей ?! – Monica

+0

@Monica: Какая ошибка/выход произошли, когда вы это сделали? – Sarfraz

+0

Я упомянул об ошибке в выходной части моего вопроса ...;) – Monica

0

Причина вы получаете ошибку из-за "TES ** ти«функцию **». использовать '$username."'".$username1

Where $username = 'tes' 
and $username1 = 'ti 
+0

Спасибо, jean, но это не моя проблема ... Я просто хочу исправить мою проблему try/catch ... на самом деле вы можете выполнить поиск с помощью этого слова «tes'ti», вы должны использовать addlashes() в php или escape() в CI ...;) – Monica

+0

@monica Ошибка в запросе. Я никогда не использовал попытку и уловку, на самом деле никогда не считал нужным быть честным. – X10nD

+0

@Jean: Я снова прочитал ваш комментарий, и теперь я понимаю ваше значение! : D thanks – Monica

1

@Monica, не уверен, если это поможет, но вы должны знать, что функции базы данных CI никогда не бросать какие-либо ошибки. Они просто вернули истину или ложь. Поэтому @Sarfraz прав, вы должны либо проверить подлинность/ложь себя, и/или выбросить Исключения самостоятельно.

Кроме того, код обработки исключений ничего не делает. Это означает, что он будет продолжать запускать любые скрипты, которые будут после него, включая скрипты, которые работают с набором записей, который просто не удался.

+0

@Fredy, вы имеете в виду, даже когда я устанавливаю «$ db ['default'] ['db_debug'] = FALSE" это не вызывает никаких исключений ?! ... И о том коде, вы правы, но это был всего лишь образец, чтобы показать мою проблему! : P – Monica

+0

@Monica. Да это верно. Нет кода CI db, КОГДА-ЛИБО НИКАКИЕ ошибки. Он вернет true или false, после чего вы должны бросить и/или поймать ошибку. – Ferdy

1

Вместо того, чтобы код воспламенитель дб ErrorMsg (HTML), я хотел бы получить дисплей JSon, то внутри АЯКС запроса я просто проверить на успех

Я переписал DB_driver.php в

function display_error($error = '', $swap = '', $native = FALSE) 


//commented 
//echo $error->show_error($heading, $message, 'error_db'); 

//this is the magic 
$data['success'] = false; 
$data['heading'] = $heading; 
$data['message'] = $message; 
$data['type'] = 'error_db'; 

echo json_encode($data); 
exit; 

это создаст JSON со значением успеха в качестве ложного

тогда я просто проверить ложь ...

работы по всей моей просьбе АЯКС .... как раз и ид ea ...

+0

Добавьте '' 'header ('Content-Type: application/json');' '' также перед '' 'exit''' '' – Shailesh

0

Для меня код @Sarfraz не работает, по крайней мере, в CI 3.1.5 проблема заключалась в том, что в запросе $ this-> db-> есть куча функций обертки, которые сразу же вызывают ошибку обработчиков, встроенных в воспламенитель кода. Если вы хотите бросить новый RuntimeException, используйте вместо этого метод $this->db->simple_query.

на стороне ФП следует рассматривать активные записи, что-то вроде:

$result = $this->db->select() 
    ->from('tbl_user') 
    ->where('username',$username) 
    ->get() 
    ->result(); 

должен обойти эти проблемы, потому что CodeIgniter активной записи рамка должна избежать запросов для вас.

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