2012-05-22 20 views
5

Tengo una instancia de CI que se conecta a un Db y comprueba los permisos antes de publicar páginas. Si la página no es accesible para el usuario actual, redirige a una página de inicio de sesión.Detecta cuando CodeIgniter no se puede conectar a un Db

La página de inicio de sesión, obviamente, tiene permisos establecidos para que sea accesible para todos los usuarios.

Después de un error reciente, el servidor de la base de datos volvió a una dirección IP diferente (gracias Amazon, EC2). Esto ocasionó que CI no pudiera verificar los permisos de ninguna página, incluido el inicio de sesión. Como el código asume que todo lo que no sea un Sí es un No, se redirigió a Iniciar sesión. El resultado fue un ciclo de redirección infinito.

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

He visto This SO Question que es lo que estoy intentando lograr pero no estoy cargando explícitamente la base de datos en ningún controlador, está en el archivo de configuración de autocarga.

Así,

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

Editar: El cheque Actualmente se está realizando en un gancho:

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

Respuesta

2

"Como el código supone que cualquier cosa que no sea un Sí es un No, se redirigió a Iniciar sesión".

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

usar algo como

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

Esto se parece a la prueba que estaba buscando: ¿presumiblemente esto será nulo/no establecido si no hay conexión? – Basic

+3

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

+0

Gracias, está funcionando muy bien – Basic

6

Se 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 los controladores heredarán el nuevo controlador.

+0

Eso parece una buena manera de ir (y puedo ver otra funcionalidad se apretó en allí también). Sin embargo, es posible que no se pueda hacer 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. – Basic

+0

Puede insertar el código 'ValidateCredentials' en el constructor' My_Controller', después de 'parent :: __ construct();' La funcionalidad seguirá siendo la misma si todos sus controladores extienden 'MY_Controller' –

+0

Gracias - Esto es algo que estoy Probablemente lo haga en el futuro, pero por el momento, creo que la respuesta de @ Laurencai es un poco más cercana a la pregunta que hice (aunque la suya parece estar más cerca de lo que necesito a más largo plazo). Gracias – Basic

Cuestiones relacionadas