Рекомендации по обработке ошибок в базе данных в CodeIgniter

У меня есть таблица с уникальным ключом ( date + userid ) в моей базе данных веб-приложений. Когда я пытаюсь вставить запись с существующей date и userid я получаю следующую ошибку:

 dupicate key in table 

Я включил отладчик базы данных в конфигурации приложения, потому что мне нужно было использовать номера и сообщения ошибок MySQL. Теперь мне нужно обработать эту ошибку. Я могу использовать жестко закодированные константы в контроллере, но я думаю, что это не очень хорошая идея. Мне нужна обработка ошибок базы данных во многих местах, и мне не нравится обработка ошибок CodeIgniter. Какова наилучшая практика обработки ошибок базы данных.

Мы используем в наших проектных конструкциях:

 $this->db->_error_number(); $this->db->_error_message(); 

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

 mysql_errno() mysql_error() 

внутри CI используют эти функции.

Что касается меня, то наилучшей практикой является использование в базовом классе пользовательского модели (BaseModel)

 $this->db->_error_number(); 

и определить ошибку, следующее исключение броска с сообщением об ошибке информации, взятым из

 $this->db->_error_message(); 

Вся ваша модель, полученная из BaseModel, и метод вызова для проверки последнего запроса на ошибку db, и ваша модель должна обрабатывать исключение и обрабатывать его (может быть дополнительно зарегистрирована), вы можете реализовать результат проверки как результат и избежать исключения исключения.

У меня есть другое предложение для этого, я порекомендую это

 $this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|callback_email_available'); 

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

Метод обратного вызова контроллера

 public function email_available($str) { // You can access $_POST variable $this->load->model('mymodel'); $result = $this->mymodel->emailAvailability($_POST['email']); if ($result) { $this->form_validation->set_message('email_available', 'The %s already exists'); return FALSE; }else{ return TRUE; } } 

И модельный метод

 public function emailAvailability($email) { $this->db->where('email',$email); $query = $this->db->get('tablename'); return $query->row(); } 

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