COPY PASTE DE AQUI:
http://soporte.miarroba.es/17451/273...rando-su-nick/
"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:
Código:
<script type="text/javascript">
<!--
setTimeout('document.location.reload()',300000);
//-->
</script>
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.
Código:
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();
}
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:
Código:
$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();
getdata es otra funcion miembro implementada por mi, la original es mysql_result($id,$registro,$campo);
Saludos, espero que te sirva de algo"