Ошибка обработки ошибок базы данных в CodeIgniter - PullRequest
1 голос
/ 05 августа 2010

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

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

Код контроллера:

    $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'

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

Ответы [ 5 ]

2 голосов
/ 05 августа 2010

Вам нужно выдать исключение, если произошла какая-то ошибка 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;
}
1 голос
/ 22 апреля 2011

Вместо того, чтобы получить код воспламенителя БД errormsg (html), я хотел получить отображение json, затем внутри запроса ajax я просто проверяю успех

Я переписал 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 со значением успеха как ложным

, тогда я просто проверю на ложность ...

Работает для всех моих запросов AJAX .... просто и идея...

1 голос
/ 09 августа 2010

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

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

0 голосов
/ 05 сентября 2017

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

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

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

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

0 голосов
/ 05 августа 2010

Причина, по которой вы получаете ошибку, связана с 'tes **' ti '**' . используйте '$username."'".$username1

Where $username = 'tes'
and $username1 = 'ti
...