Detectar cuando CodeIgniter no se conecta a una base de datos

Tengo una instancia de CI que se conecta a una base de datos y verifica los permisos antes de publicar páginas. Si la página no es accesible para el usuario actual, se redirige a una página de inicio de sesión.

La página de inicio de sesión, obviamente, tiene permisos establecidos para que todos los usuarios puedan acceder a ella.

Después de una falla reciente, el servidor de la base de datos volvió a funcionar en una dirección IP diferente (gracias Amazon, EC2). Esto provocó que CI no pudiera verificar los permisos para ninguna página, incluido el inicio de sesión. Dado que el código asume que cualquier cosa que no sea un Sí es un No, se redirige a Iniciar sesión. El resultado fue un bucle de redireccionamiento infinito.

Si bien este problema exacto no debería volver a ocurrir (IP elástica estática), me gustaría detectar cuándo la conexión Db está inactiva y manejarla de manera adecuada.

He visto Esta pregunta SO que es lo que estoy tratando de lograr, pero no estoy cargando explícitamente la base de datos en ningún controlador, está en el archivo de configuración de carga automática.

¿Entonces

¿Cómo puedo consultar el estado de la conexión Db desde dentro de CI? ¿Tengo que ejecutar una consulta inútil y verificar si obtengo resultados o hay una solución más elegante?

Editar: la verificación se está realizando actualmente en un gancho:

$hook['post_controller_constructor'] = array(
                                'class'    => 'AuthHook',
                                'function' => 'ValidateCredentials',
                                'filename' => 'auth.php',
                                'filepath' => 'hooks'
                                );

preguntado el 22 de mayo de 12 a las 17:05

2 Respuestas

Puede extender el controlador y cargar la base de datos en su constructor:

    class My_Controller extends CI_Controller {
        public function __construct(){
            parent::__construct();
             if ( $this->load->database() === FALSE )
             {
                //do something
             }
         }
     }

Todos sus controladores heredarán el nuevo controlador.

contestado el 22 de mayo de 12 a las 17:05

Parece una buena manera de hacerlo (y puedo ver que también se incluyen otras funciones). Sin embargo, puede que no sea posible hacerlo de esa manera ya que la verificación de permisos se está realizando actualmente dentro de un enlace. No lo mencioné porque no pensé que sería relevante. Actualizaré la Q con más información. - Básico

Puede insertar el ValidateCredentials codificar en My_Controllerconstructor de , después parent::__construct(); La funcionalidad seguirá siendo la misma si todos sus controladores se extienden MY_Controller - yan berk

Gracias. Es probable que haga esto en el futuro, pero por el momento, creo que la respuesta de @Laurencai está un poco más cerca de la pregunta que hice (aunque la tuya parece estar más cerca de lo que necesito a largo plazo). Gracias - Básico

"Dado que el código asume que cualquier cosa que no sea un Sí es un No, se redirige a Iniciar sesión".

Por lo tanto, solo necesita modificar la función lógica de inicio de sesión para verificar específicamente una conexión de base de datos (y, por lo tanto, seguir cargando automáticamente la base de datos).

Usa algo como

 $result = $this->db->conn_id;  

contestado el 22 de mayo de 12 a las 18:05

Esto se parece a la prueba que buscaba; presumiblemente, ¿será nulo/desestablecido si no hay conexión? - Básico

en realidad será falso, por lo que podría hacer "if (! $this->db->conn_id)) - Laurence

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.