Ошибка обработки базы данных Codeigniter без num_rows () - PullRequest
4 голосов
/ 15 июля 2011

У меня проблемы с поиском простого метода обработки ошибок базы данных в CI.Например, я не могу вставить повторяющиеся записи в таблицу базы данных.Если я пытаюсь это сделать, я получаю ошибку базы данных 1062.

Наиболее распространенное предлагаемое решение - проверить, существует ли уже запись, и использовать

$query->num_rows() > 0

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

Я нашел следующие функции, которые могут помочь

$this->db->affected_rows()

$this->db->_error_message()

, но я не уверен, как их использовать.

Я пытался в моей модели:

$this->db->insert('subscription', $data);
return $this->db->affected_rows();

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

$affected = $this->Subscribe_model->subscribe($data);

if ($affected < 1)
{
    //display error message in view
}
else
{
   $this->Subscribe_model->subscribe($data); //perform query
}

К сожалению, сценарий останавливается в модели на $this->db->insert('subscription', $data);, если возникает ошибка, и отображает ошибку всей базы данных.

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Я не знаю, работает ли это для $this->db->insert();, но $this->db->query(); вернет false, если произойдет ошибка, чтобы вы могли сделать что-то вроде этого:

$sql = $this->db->insert_string('subscription', $data);
$sql = $this->db->query($sql)
if(!$sql){
    //Do your error handling here
} else {
    //query ran successfully
}
1 голос
/ 15 июля 2011

Попробуйте использовать @$this->db->insert('subscription', $data);, @, в PHP это означает «подавить предупреждение».

В качестве альтернативы - если вы знаете, что данные безопасны, или вы хотите использовать $this->db->insert_stringВы можете добавить on duplicate key в конец запроса.

Это должно работать (не проверено):

$this->db->simple_query( $this->db->insert_string( 'subscription', $data ) . 
                            ' ON DUPLICATE KEY ' . 
                            $this->db->update_string( 
                                        'subscription', 
                                         $data, 
                                         /* your where clause here */ );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...