Cuando 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í:
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.
Interesante solución. Saludos!
[…] http://www.davidrojas.net/index.php/desarrollo-web/manejo-de-errores-en-la-base-de-datos-con-codeign… AKPC_IDS += "2967,"; […]
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….;
}
@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 🙂
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.
@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
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.
@Dani Quizá cuando salga la versión 2.0 oficial (la 1.7.2 sigue siendo la rama estable) haga uno nuevo.
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?
@Germán Sí, un delete también puede dar un error.
hola amigo, gracias por todo .
me gustaria saber cuando empiezas con las novedades de codeigniter 2.0
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
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 …
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
justo lo que estaba buscando, excelente articulo. saludos
justo lo q queria…
se puede deshabilitar esto de forma dinamica es decir en un script en especifico ?
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
Me ha servido de una manera espectacular
resource here
blog topic
drain jetting west bromwich
Manejo de errores en MySQL con CodeIgniter « David Rojas – Diseño y desarrollo web
farrow and ball wallpaper
Manejo de errores en MySQL con CodeIgniter « David Rojas – Diseño y desarrollo web