Manejo de errores en MySQL con CodeIgniter

codeigniter_mysql_errorsCuando tenemos un error conectando o realizando operaciones con la base de datos (MySQL) usando CodeIgniter, lo normal es que el sistema nos muestre un mensaje por defecto con el código, descripción y query ejecutado, tal que así:

error_db_ci

Esta página de error se puede personalizar editando la plantilla /errors/error_db.php en nuestra carpeta de la aplicación. El problema es que este mensaje se mostrará en lugar de nuestra vista o en medio de ella, y además se mostrará siempre a menos que desactivemos la opción de debug de la base de datos, y si lo hacemos nuestra aplicación fallará silenciosamente, no tenemos forma de capturar este error y realizar las operaciones que nos convengan, lo cual sería especialmente útil cuando hacemos peticiones ajax.

Para solucionar esto existen dos métodos no documentados en la clase DB que nos permite capturar el mensaje de error y el número:
$this->db->_error_message() y $this->db->_error_number().

Estos métodos son envoltorios de las funciones mysql_error() y mysql_errno() de php. En la documentación de mysql podemos encontrar el listado de códigos de errores que nos devuelve mysql_errno() (y por lo tanto $this->db->_error_number()), por si nos interesa realizar distintas operaciones según el tipo de error ocurrido.

Como ejemplo os mostraré una forma sencilla de gestionar estos mensajes de error:

En primer lugar debemos desactivar el debug de la base de datos poniendo la opción $db[‘default’][‘db_debug’] a FALSE en el archivo /config/database.php.

Después en nuestro método del modelo, tras el query a la BD podemos poner:

if($data['error'] = $this->db->_error_message());
return $data;

En el controlador recogeremos esta variable devuelta y la pasaremos a la vista, y en la parte de la vista que nos interese pondremos:

<?php if(isset($error)) echo '<div class="error">'.$error.'</div>';?>

De la misma manera podemos manejar los errores vía ajax devolviendo esta variable codificada con json en nuestro controlador y gestionándola en el javascript de la vista.

Finalmente, ante la avalancha de peticiones espero volver en breve con un último videotutorial sobre CodeIgniter.

Compartir:

Enlaces

19 comentarios para “Manejo de errores en MySQL con CodeIgniter”

  1. Julian dice:

    Interesante solución. Saludos!

  2. Ander dice:

    Para obtener errores de conexión en bases de datos, no se puede utilizar la solución que propones, puesto que al no haber conexión, las funciones _error_message y _error_number fallan al no existir un id de conexión.

    Para el caso concreto de la conexión, yo utilizo la propiedad conn_id de la base de datos para comprobar si la conexión se ha realizado correctamente o no.

    A modo de ejemplo:
    $db = $this->load->database(‘nombre_db’, TRUE);
    if (!$db->conn_id) {
    echo “DB connection error!”;
    //hacer aqui lo que sea para recuperar el error….;
    }

  3. David Rojas dice:

    @Ander Tienes toda la razón, precisamente hace un par de días me ocurrió, que me falló al tener los datos user/pass mal puestos. Para el resto de errores sí funciona. Gracias por la aportación 🙂

  4. Dani dice:

    Hola David, tengo un problema con el manejo de errores en codeigniter:

    try{
    foreach($csvData as $value){
    $p = new Productos();
    $p->nombre = $value[‘N’];
    $p->precio = $value[‘P’]; //’P’ No existe.
    //…
    }
    }
    catch (Exception $ex){
    echo ‘—>’.$ex;
    }

    Bien, el array $value[‘P’] No existe, sin embargo la excepción no me salta al catch.
    Como puedo solucionarlo?

    Gracias y felicitaciones por los artículos.

  5. David Rojas dice:

    @Dani Esto no es un problema de CodeIgniter, es PHP simplemente. ¿Lanzas el error en algún sitio? No sé si sabes como funcionan la captura de errores, pero para capturar excepciones debes lanzarla primero donde toque, mira los ejemplos: http://php.net/manual/es/language.exceptions.php

  6. Dani dice:

    Gracias por la información David.

    Pensaba que codeigniter lanzaba las excepciones por si solo.

    Sí, lo tenia parcheado haciendo una comprobación antes del array

    if( !isset($value[‘P’]) )throw new Exception (‘No existe P);

    Es una pena que no siguas con los webcast de este framework y más ahora que está apunto de salir la 2.1, pero gracias igualmente porque me resultaron muy útiles para iniciarme.

    Saludos y gracias nuevamente.

  7. David Rojas dice:

    @Dani Quizá cuando salga la versión 2.0 oficial (la 1.7.2 sigue siendo la rama estable) haga uno nuevo.

  8. Germán dice:

    David, gracias por la solucion. Queria preguntarte tambien, cuando hago un delete, tendria que preguntar algo como

    $this->db->delete() //con el nombre de la tabla y los agumentos de la funcion evidentemente.
    if (isset($this->db->_error_message())

    o no?

  9. David Rojas dice:

    @Germán Sí, un delete también puede dar un error.

  10. galax dice:

    hola amigo, gracias por todo .

    me gustaria saber cuando empiezas con las novedades de codeigniter 2.0

  11. Hola amigos me ha servido de mucho esto de controlar errores de la base de datos.

    muchas gracias de esta forma el codigo ahora es mas limpio.

    un 10.

    saludos

  12. jose dice:

    hola david quisiera consultarte como puedo ver datos blob en codeigniter por que cuando incluyo en un php dentro del view el codigo php:

    imagen
    ?>

    me da como resultado:
    error al tratar de mostrar la imagen de http://localhost/prueba/mostrarimagen/

    yo pensaba que no trahia los resultados pero cuando borro el header si me los muestra en codigos ascii
    que podria hacer
    de ante mano muchas gracias …

  13. Leo dice:

    Hola a todos, muy interesante el post, sobre lo que dice Ander para controlar el error de conexion, ¿si la conexión está configurada como automática y no hacemos el “load->database” como podemos controlarla?

    “Para obtener errores de conexión en bases de datos, no se puede utilizar la solución que propones, puesto que al no haber conexión, las funciones _error_message y _error_number fallan al no existir un id de conexión.

    Para el caso concreto de la conexión, yo utilizo la propiedad conn_id de la base de datos para comprobar si la conexión se ha realizado correctamente o no.

    A modo de ejemplo:
    $db = $this->load->database(‘nombre_db’, TRUE);
    if (!$db->conn_id) {
    echo “DB connection error!”;
    //hacer aqui lo que sea para recuperar el error….;
    }”

    un saludo y gracias

  14. cheme dice:

    justo lo que estaba buscando, excelente articulo. saludos

  15. Yusniel dice:

    justo lo q queria…

  16. juan dice:

    se puede deshabilitar esto de forma dinamica es decir en un script en especifico ?

  17. nico dice:

    hola daniel me surge este problema: Unable to connect to your database server using the provided settings.

    me dice que es en …system\database\DB_driver.php
    linea 124

    es eso o cuando arreglo el $config[‘base_url’] directamente me muestra la pagina en blanco, esto solo sucede cuando subo la pagina, porque en servidor local funciona lo mas bien

  18. Camilo Lopez dice:

    Me ha servido de una manera espectacular

Deja un comentario

Introduce tu información personal en el formulario, regístrate o identifícate usando twitter con el siguiente botón.

Time limit is exhausted. Please reload the CAPTCHA.

RSS iTunes podcast Twitter

Categorías

Enlaces

Archivos