Foros del Web » Programando para Internet » PHP » CodeIgniter »

Obtener los usuarios que estan conectados

Estas en el tema de Obtener los usuarios que estan conectados en el foro de CodeIgniter en Foros del Web. Estoy intentando mostrar que usuarios estan conectados en mi sitio (y quizas tambien seria bueno mostrar todos los no registrados que estan visitando) algo asi ...
  #1 (permalink)  
Antiguo 12/02/2013, 17:29
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Obtener los usuarios que estan conectados

Estoy intentando mostrar que usuarios estan conectados en mi sitio (y quizas tambien seria bueno mostrar todos los no registrados que estan visitando) algo asi como lo hacen los foros..

Estoy utilizando las sesiones que se guardan en la DB por lo que alli se van guardando todos los usuarios que estan conectados pero estoy teniendo muchas confusiones de como hacer esto =/..

¿Alguien tiene una idea de como hacerlo?
  #2 (permalink)  
Antiguo 12/02/2013, 17:37
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

si las sessiones se guardan en la db, puedes sacar las sessiones activas por fecha, es decir, obtener las sesiones que han estado activas en los ultimos 15 minutos (o el tiempo que quieras), usando consulta SQL sera facil hacer lo que necesitas
Saludos
__________________
>> abimaelmartell.com
  #3 (permalink)  
Antiguo 12/02/2013, 17:46
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

Cita:
Iniciado por abimex Ver Mensaje
si las sessiones se guardan en la db, puedes sacar las sessiones activas por fecha, es decir, obtener las sesiones que han estado activas en los ultimos 15 minutos (o el tiempo que quieras), usando consulta SQL sera facil hacer lo que necesitas
Saludos
Si eso si.. El problema es que es un lio en realidad saber que usuario esta y quien no..
Al utilizar las sessiones en db te piden que crees una tabla que contenga:
session_id, ip_adrress, user_agent, last_activity y user_data(que es donde se guardan todos los datos de las sessiones que has cargado)
El problema es que en user_data la informacion se guarda asi:
a:7:{s:9:"user_data";s:0:"";s:2:"id";s:1:"1";s:7:" usuario";s:7:"gonza";s:6:"nombre";s:7:"Gonzalo";s: 8:"apellido";s:16:"Fernandez";s:5:"rango";s:1:"2"; s:8:"conexion";b:1;}

Entonces no se como hacer el control de que usuario esta conectado..

Habia hecho esto pero no me convence mucho..
Código PHP:
Ver original
  1. public function Estado($usuario)
  2.         {
  3.             $funcion = $this->CI->db
  4.                                     ->like('user_data', $usuario)
  5.                                     ->limit(1)
  6.                                     ->order_by('last_activity', 'desc')
  7.                                     ->get('ci_sessions');      
  8.                                    
  9.             if($funcion->num_rows() > 0)
  10.             {
  11.                 $cuenta = $funcion->row()->last_activity;
  12.                 $now = time();
  13.                 $tiempo = $cuenta + 3600;
  14.                 if($tiempo > $now)
  15.                 {
  16.                     return false;
  17.                 }
  18.                 else
  19.                 {
  20.                     $inactividad = $now - $tiempo;
  21.                     return false;
  22.                 }
  23.                
  24.             }
  25.             else
  26.             {
  27.  
  28.             return false;
  29.             }
  30.            
  31.            
  32.            
  33.         }
  34.  
  35.         public function WhosOnline()
  36.         {
  37.             $funcion = $this->CI->db->get('miembros');
  38.  
  39.             foreach($funcion->result() as $row)
  40.             {
  41.                 $consulta = $funcion->row();
  42.                 $data[] = $this->Estado($row->usuario);
  43.                
  44.             }
  45.             return $data;
  46.            
  47.            
  48.         }
  #4 (permalink)  
Antiguo 12/02/2013, 18:02
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

¿por qué no guardas el id del usuario? es mejor que guardar el objeto serializado y las consultas son mas faciles
y last_activity es un int o un datetime?
__________________
>> abimaelmartell.com
  #5 (permalink)  
Antiguo 12/02/2013, 18:11
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

Cita:
Iniciado por abimex Ver Mensaje
¿por qué no guardas el id del usuario? es mejor que guardar el objeto serializado y las consultas son mas faciles
y last_activity es un int o un datetime?
Eso estaba pensando :P Estoy intentando agregar a una nueva columna llamada "user_id" la id del usuario entonces todo seria mucho mas simple pero no se como invocarlo ya que si hago $this->CI->session->userdata('id') no me funciona, me da error..

Código PHP:
Ver original
  1. A PHP Error was encountered
  2.  
  3. Severity: Notice
  4.  
  5. Message: Undefined property: Login::$session
  6.  
  7. Filename: libraries/Session.php
  8.  
  9. Line Number: 235

Y last_activity es un int..
  #6 (permalink)  
Antiguo 12/02/2013, 18:15
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

Código PHP:
Ver original
  1. var_dump($this->session->all_userdata());
eso que te dá?
__________________
>> abimaelmartell.com
  #7 (permalink)  
Antiguo 12/02/2013, 18:25
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

Código PHP:
Ver original
  1. $timeout = time() - 900; # 15 minutos
  2. $this->db->where('last_activity <', $timeout);
  3. $sessions = $this->db->get('ci_sessions');
creo que eso te deberia traer las sessiones activas en los utlimos 15 minutos, no estoy seguro si funciona XD
__________________
>> abimaelmartell.com
  #8 (permalink)  
Antiguo 12/02/2013, 18:26
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

Cita:
Iniciado por abimex Ver Mensaje
Código PHP:
Ver original
  1. var_dump($this->session->all_userdata());
eso que te dá?
Un error mio fue que me estaba equivocando donde estaba trabajando..
Tuve que editar en system/libraries/Sessions.php donde dice sess_write:
Allí hay un llamado a sess_update();
el cual quedo asi:
Código PHP:
Ver original
  1. $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata, 'user_id' => $this->userdata('id')));

Ahora si se guarda el id en la sesion..
Entonces tu dices que busque en la base de datos mis id, y por cada uno busque un valor en la tabla ci_sessions (la cual te pide codeigniter que crees para guardar las sesiones) que contenga ese id y si esta entonces controle el tiempo que lleva activo?
  #9 (permalink)  
Antiguo 12/02/2013, 18:29
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

nonon, no edites el core, es lo peor que puedes hacer, trata lo que puse arriba, eso deberia traerte las sessiones activas
__________________
>> abimaelmartell.com
  #10 (permalink)  
Antiguo 12/02/2013, 18:38
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

Cita:
Iniciado por abimex Ver Mensaje
nonon, no edites el core, es lo peor que puedes hacer, trata lo que puse arriba, eso deberia traerte las sessiones activas
Si eso funciona como dices pero como puedo sacar el nombre del usuario de cada sesion si todos sus datos se almacenan en una sola columna llamada user_data donde los datos estan de esta forma:
a:7:{s:9:"user_data";s:0:"";s:2:"id";s:1:"1";s:7:" usuario";s:7:"gonza";s:6:"nombre";s:7:"Gonzalo";s: 8:"apellido";s:16:"Fernandez";s:5:"rango";s:1:"2 "; s:8:"conexion";b:1;}

(Igual lo que edite del core lo unico que hace es envez de agregar el nombre del usuario a user_data lo agregue al nombre solo en una columna.. no afecta al funcionamiento del sistema)
  #11 (permalink)  
Antiguo 12/02/2013, 18:40
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

eso esta serializado, usa la funcion unserialize de php
http://php.net/manual/es/function.unserialize.php
Código PHP:
Ver original
  1. unserialize($tabla->userdata);
y te dara un objeto php con los datos, por favor no modifiques el core, eso hace que tu aplicacion sea inmantenible
__________________
>> abimaelmartell.com
  #12 (permalink)  
Antiguo 12/02/2013, 19:20
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

Cita:
Iniciado por abimex Ver Mensaje
eso esta serializado, usa la funcion unserialize de php
[url]http://php.net/manual/es/function.unserialize.php[/url]
Código PHP:
Ver original
  1. unserialize($tabla->userdata);
y te dara un objeto php con los datos, por favor no modifiques el core, eso hace que tu aplicacion sea inmantenible
Esta bien no lo modificare xD!

Bueno pero mira entonces para comparar como hago? Es decir, la unica forma que se es usar like('user_data', $usuario) entonces si encuentra el nombre del usuario dentro del user_data sabre de que usuario estoy tratando pero el problema es que sucederia si tengo un usuario llamado Gonza y el otro GonzaFY, me dara los dos..

Entonces como utilizo ese unserialize para hacer where(user_data('usuario'), $usuario)
no se si me entiendes .. (? Es algo raro lo que digo xd
  #13 (permalink)  
Antiguo 12/02/2013, 19:27
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: Obtener los usuarios que estan conectados

lo que puedes hacer es en la tabla de usuario, meter un campo para guardar la ulttima actividad, y en cada request actualizar ese campo
__________________
>> abimaelmartell.com
  #14 (permalink)  
Antiguo 12/02/2013, 20:27
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

No estaria mal, lo tendre en cuenta como segunda opcion, lo malo es que estaria desperdiciando la tabla ya creada..

Igualmente deberia poderse! Es decir si hago este llamado:
Código PHP:
Ver original
  1. $user = unserialize('user_data');
  2.            
  3.             $funcion = $this->CI->db->where($user["usuario"], $usuario)
  4.                                     ->where('last_activity >', time()-500)
  5.                                     ->order_by('last_activity', 'desc')
  6.                                     ->get('ci_sessions');
Deberia controlar que User_data => Usuario sea igual a $usuario pero no se porque no me funciona.. Digamos creo que lo que digo es logico pero no se si se puede..

Seguire buscando en google
  #15 (permalink)  
Antiguo 12/02/2013, 22:28
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Obtener los usuarios que estan conectados

Ya tengo la solucion, en verdad fui un tonto..
Era tan facil y no me di cuenta..

Lo unico que debia hacer era obtener las actividades de los ultimos X minutos. Una vez obtenidas controlo si tienen algun dato en la columna user_data, en caso que no tenga es porque es un visitante, y si esto es positivo entonces hago un return con esa informacion entonces estaria devolviendo todos los datos de cada usuario conectado..

El codigo es este:
Código PHP:
Ver original
  1. function conectados()
  2.     {
  3.        
  4.             $data = $this->miembros->Todos();
  5.             if(!$data == '')
  6.             {
  7.                 foreach($data as $result)
  8.                 {
  9.                     $columna = unserialize($result->user_data);
  10.                     echo $columna['usuario'] . '<br />';
  11.                    
  12.                 }
  13.             }
  14.             else {
  15.                
  16.                 echo 'No hay ningun usuario online';
  17.             }
  18.            
  19.        
  20.     }

Y luego para implementarlo (lo tengo puesto en el controller solo para probar)
Código PHP:
Ver original
  1. function conectados()
  2.     {
  3.        
  4.             $data = $this->miembros->Todos();
  5.             if(!$data == '')
  6.             {
  7.                 foreach($data as $result)
  8.                 {
  9.                     $columna = unserialize($result->user_data);
  10.                     echo $columna['usuario'] . '<br />';
  11.                    
  12.                 }
  13.             }
  14.             else {
  15.                
  16.                 echo 'No hay ningun usuario online';
  17.             }
  18.            
  19.        
  20.     }

(En esta funcion controlo que data no sea '' ya que en la libreria al solicitar ->miembros->Todos() al comienzo declaro un array por si no hay ningun usuario conectado se devuelva algo de lo contrario si lo quito me termina dando un error de que no hay return en el login....)

Última edición por GonzaFY; 12/02/2013 a las 22:36

Etiquetas: conectados, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:14.