ehfk
Usuario Novato
Usuario Novato

Tengo un sistema de registro de usuarios que utilica cookies, y quisiera saber si es posible mostrar al usuario registrado que ha iniciado sesion quienes mas están conectados. Mi script solamente reconoce al usuario y guadra sus datos en cookies, pero me parece que no se puede utilizar para saber quienes estan conectados al instante.
Si esto no es posible, alguien conoce algun script?

Avatar Image
Machacateclados
Machacateclados

Pues a la mejor sería más practico guardar una lista de tus usuarios conectados en una base de datos, cada vez que alguien inicie sesión, la detectas y actualizas tu base de datos con la información del usuario, luego con otro script mandas a leer los registros que serán las personas en línea y ya está.

tluu
Usuario habitual
Usuario habitual
Escrito originalmente por Haggenx
Pues a la mejor sería más practico guardar una lista de tus usuarios conectados en una base de datos, cada vez que alguien inicie sesión, la detectas y actualizas tu base de datos con la información del usuario, luego con otro script mandas a leer los registros que serán las personas en línea y ya está.




el problema de eso es que los que se registran como conectados estan siempre conectados...

lo que dices esta bien.. pero debe existir la forma de saber cuando alguien esta o no viendo tu pagina...
Avatar Image
Machacateclados
Machacateclados
Escrito originalmente por tluu
Escrito originalmente por Haggenx
Pues a la mejor sería más practico guardar una lista de tus usuarios conectados en una base de datos, cada vez que alguien inicie sesión, la detectas y actualizas tu base de datos con la información del usuario, luego con otro script mandas a leer los registros que serán las personas en línea y ya está.




el problema de eso es que los que se registran como conectados estan siempre conectados...

lo que dices esta bien.. pero debe existir la forma de saber cuando alguien esta o no viendo tu pagina...


Pues no necesariamente, puedes tener un campo mas que es el periodo de vida del usuario conectado, cada vez que alguien hace algo se actualiza su campo con el tiempo, le das al tiempo no se 15 minutos de mas, al entrar alguien se actualiza toda la tabla borrando aquellos que ya pasaron su tiempo y asi no aparecen como conectados, pero el problema es que es lento esto porque cada vez se actualiza.
tluu
Usuario habitual
Usuario habitual
Escrito originalmente por Haggenx
Pues no necesariamente, puedes tener un campo mas que es el periodo de vida del usuario conectado, cada vez que alguien hace algo se actualiza su campo con el tiempo, le das al tiempo no se 15 minutos de mas, al entrar alguien se actualiza toda la tabla borrando aquellos que ya pasaron su tiempo y asi no aparecen como conectados, pero el problema es que es lento esto porque cada vez se actualiza.



Sip eso puede ser.. igual no es tan exacto...
Avatar Image
Usuario Novato
Usuario Novato

pues mira esto parece sencillo, pero no lo es. resulta que en un primer analisis podrías pensar que tan solo  teniendo un campo adicional en tu tabla de cuentas de usuario  en la bd con el cual determinaras si esta online o no bastaria, pero nada mas lejos de la realidad.

Esto que he dicho si es necesario, y podrías hacerlo con un campo tipo binario de logintud 1, asi podras poner los valores 0 y 1. Ante todo te recomiendo NO crear una nueva tabla en la que relaciones usuario y estado (conectado o desconectado) pq basta con poner dicho campo en tu tabla accounts. Además necesitas otro campo que indique la fecha de la ultima vez que dicho usuario conectó, y bastaria con usar un campo de tipo entero, y almacenar ahi  lo que devuelve time(); (numero de segundos  transcurridos dede el 1 de enero de 1970) en vez de usar un timestamp que es lo mismo pero formateado (AAAA-MM-DD HH-MM-SS) y es siempre mejor usar segundos para poder calcular si hemos sobrepasado el timeout establecido.

Tienes que actualizar el campo de estado y el de ultima visita cuando haga login y cuando haga logout deberas poner el estado a 0.

El problema viene cuando el usuario cierra el navegador, en ese caso estará desconectado, pero no habrá cerrado la sesion, pues es un evento que obviamente no puedes controlar en php.

Por eso necesitamos establecer un tiempo de vida, y en este caso te recomiendo que sea de 5 minutos.

Cuando un usuario se mueve dentro de tu web o foro, actualiza la lista de usuarios eliminando aquellos que hayan agotado  los 5 minutos y actualiza su ultima visita con time();

Con esto, cuando un usuario cierra el navegador, tardara solo 5 minutos en desaparecer. Si das un tiempo de vida superior, obviamente el desfase será ya increible, por lo tanto, un tiempo de visa superior a 5 minutos es desechable.

Con este sistema además consigues mostrar tus usuarios incluso si usas auto-identificación mediante cookies, ya que actualizas la lista de usuarios conectados en cada página, y es que esta será tu manera de detectar que el usuario sigue ahí.

Solo existe un problema:

Si un suario deja una pagina de tu sitio abierta durante mas de 5 minutos, se supone que está conectado, pero pasados 5 minutos los demas usuarios lo verían desconectado, y esto es informacion falsa.

Esto se puede solucionar haciendo que la pagina se recargue cada 5 minutos, con lo que volvera a procesar la pagina php y actualizara la lista de usuarios incluido asi mismo. esto se puede hacer con javascript.

el codigo para refrescar la pagina cada 5 minutos es el siguiente:

[code]

<script type="text/javascript">
<!--
 setTimeout('document.location.reload()',300000);
//-->
</script>

[/code]

Lo que hace setTimeout es ejecutar la funcion que se le pasa como primer argumento transcurrido el tiempo en milisegundos que se indica con el segundo parametro.

Una funcion para actualizar la lista de usuarios coenctados seria la siguiente, pero cuidado, aqui yo uso una tabla aparte, cosa que he recomendado que no hagas, pero en mi caso tengo miis motivos para hacerlo.

[code]

function update_online_list()
{
      $db = new database();
      $db->connect();

      $time = time();
      $timeout = $time-300;

      $db->query("delete from online where logged < "$timeout"");

      $qid = $db->query("select user from online where user="".$_SESSION['user'].""");
    

      if($db->numregs($qid) != 0)
      {
            $db->query("update online set logged='$time' where user="".$_SESSION['user'].""");
      }
      else $db->query("insert into online values('".$_SESSION['user']."','$time')");

      $db->close();
 }

[/code]

 Nota: la clase database es una clase que yo cree para facilitarme las cosas y la funcion miembro numregs devuelve el numero de registros de la consulta. la original es mysql_num_rows($qid); donde $qid es el identificador de la consulta.

Esta funcion iria en un php con diversas funciones k uses y lo suyo seria hacer un include,require o require_once (depende) y luego invocarla, todo eso en cada pagina php  tras hacer tus comprobaciones para conocer si el usuario esta registrado y todo eso que solemos hacer antes de la cabecera.

el scrit para refrescar la pagina va en todas las paginas que ademas incluyan esta funcion y son todas aquellas paginas navegables de tu sitio.

Luego para mostrar tu lista de usuariso coenctados basta con tomar todos los registros de dicha tabla que yo he llamado online, seleccionando solo el campo user y ya ahi es cosa tuya como presentes la informacion.

ejemplo:

 [code]

$db = new database();
$db->connect();

$result = $db->query("select user from online");

for ($i = 0; $i < $db->numregs($result); ++$i){

          $usuario = $db->getdata($result,$i,"user");

           //muestra el usuario como desees.

}

$db->close();

[/code]

getdata es otra funcion miembro implementada por mi, la original es mysql_result($id,$registro,$campo);

Saludos, espero que te sirva de algo

Avatar Image
Machacateclados
Machacateclados

pero recargar la pagina cada 5 minutos no esta mal pero siempre y cuando no sea la pagina activa porque imagenense que estoy redactando un mensaje en un foro hipotetico y ya pasaron 5 minutos y zaz se me recarga la pagina y adios a lo que habia escrito, creo que seria bueno tener un marco oculto o un iframe que sea el que se este recargando y manteniendo viva la session, asi el usuario no se ve afectado.

Avatar Image
Usuario Novato
Usuario Novato

si, tienes mucha razon, el problema viene cuando recargas la pagina de nueva respuesta o nuevo tema k te jode lo que has escrito.

En ese caso la idea que has aportado parece ideal para esto.

Otra solucion es no actualizar cuando el usuario permanece quieto en una pagina, pero eso mas que una solucion es dar un paso atras, eso es lo k hacen en los punbb, foro que puedes descrgar y usar (hacen o hacian) pero es cutre.

ATENCIÓN: Este tema no tiene actividad desde hace más de 6 MESES,
te recomendamos abrir un nuevo tema en lugar de responder al actual
Opciones:
Ir al subforo:
Permisos:
TU NO PUEDES Escribir nuevos temas
TU NO PUEDES Responder a los temas
TU NO PUEDES Editar tus propios mensajes
TU NO PUEDES Borrar tus propios mensajes
Temas similares
TemaUsuariosRespuestasVisitasActividad
Por: User 180043, el 16/Dic/2005, 18:17
User 180043 NoSetup.org39kDec/05