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