2009-04-09 14 views
5

Tengo una tabla con una clave única (date + userid) en la base de datos de mi aplicación web. Cuando trato de insertar registro con date existente y userid recibo el siguiente error:Mejores prácticas para procesar errores de la base de datos en CodeIgniter

dupicate key in table 

Encendí el depurador de base de datos de configuración de aplicación, ya que necesitaba usar números y mensajes de error de MySQL. Ahora necesito procesar este error. Puedo usar constantes codificadas en el controlador, pero creo que no es una buena idea. Necesito el manejo de errores de base de datos en muchos lugares, y no me gusta el manejo de errores de CodeIgniter. ¿Cuál es una mejor práctica sobre el procesamiento de errores de base de datos?

Respuesta

9

que utilizamos en nuestras construcciones de proyectos como éstos:

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

pero esto funciones no documentadas y en próximas versiones esto podría cambiar. Por supuesto, puede simplemente usar php estándar para la función de asa de error mysql:

mysql_errno() 
mysql_error() 

internamente IC utilizar estas funciones.

En cuanto a mí, la mejor práctica es el uso en la clase base personalizado de Modelo (BaseModel)

$this->db->_error_number(); 

y determinar el error, junto excepción tiro con el mensaje de error información tomada de

$this->db->_error_message(); 

Todo el Modelo derivado de BaseModel, y método de llamada para verificar la última solicitud de error de db y su Modelo debe manejar la excepción y procesarla (puede ser un registro adicional), por supuesto puede implementar el resultado de verificación como resultado y evitar lanzar una excepción.

+0

uso estas funciones también. BaseModel es una buena idea, y lo pienso. Gracias. IMO arrojar método de excepción con la excepción de manipulación del modelo es un poco difícil y no transparente. Necesito errores de procesamiento simples inmediatamente después de ejecutar la consulta. Debo tomar la decisión de confiar en _error_number() – drnk

+0

Esos no son constructores, pero es una buena respuesta. – Zack

0

Tengo una sugerencia diferente para este Voy a recomendar este

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

al enviar el formulario que necesita para definir las reglas. Siempre utilizar devoluciones de llamada para interactuar con la base de datos

método

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; 
    } 
} 

y el modelo de controlador método de devolución de llamada

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

este modo, siempre evitar errores de base de datos en el frente y puede obtener usuario ver las cosas de una mejor manera. no es necesario que maneje los errores de db porque la validación de formularios lo maneja todo por usted.

Cuestiones relacionadas