У меня есть таблица с уникальным ключом ( 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, потому что проверка формы обрабатывает все для вас.