Foros del Web » Programando para Internet » PHP »

Online y offline usuarios

Estas en el tema de Online y offline usuarios en el foro de PHP en Foros del Web. Hola, llevo una par de días liado con una aplicación que estoy desarrollando pero no me sale, lo he intentado todo! Quiero que los usuarios ...
  #1 (permalink)  
Antiguo 14/10/2013, 14:21
 
Fecha de Ingreso: febrero-2012
Mensajes: 23
Antigüedad: 12 años, 2 meses
Puntos: 0
Online y offline usuarios

Hola,

llevo una par de días liado con una aplicación que estoy desarrollando pero no me sale, lo he intentado todo!
Quiero que los usuarios resulten offline o online al conectarse a mi web.
En mi base de datos tempo un campo con nombre "estado" y su valor varia entre "Online" y "offline" al hacer login y logout.
Ya tengo sesiones y coockie creadas, todo funciona bien... pero...
El problema es que al cerrar la ventana del navegador el estado se queda "online", y ya que no puedo llamar ningún script en php no logro cambiar el valor a offline.

He pensadoen la siguiente solución...
En el body pongo:

Código:
<body onbeforeunload=funzione()>
En el head:

Código:
 <script type="text/javascript"> 
 function funzione()  {   
$.ajax({   
url: 'php/offline.php',   
type: 'post',   
data: '',   
success: function()      {    
 alert(ok');     
}   
});  
}
</script>
Y el php:


Código PHP:
<?php
 
include "config.php";
 
$DB = new DB();
 
$DB->connect();
 
session_start();
 
$id_usuario_out $_SESSION['id_usuario_ses'];
 
$sqlonline "UPDATE usuario SET estado = 'offline' WHERE id_usuario = '$id_usuario_out' LIMIT 1";
 
$onlineses mysql_query($sqlonline);
 
$last_onlineses mysql_insert_id();
}
?>
¿Porque no me funciona?
Creéis que el razonamiento es justo? Hago bien a usar onbeforeunload?
Creo que me equivoco con la conexión entre php e JavaScript...
Lo que quiero conseguir es el clásico "online" y "offline" de toda la vida, lo del las chat, que ya se usa desde años...

Gracias
  #2 (permalink)  
Antiguo 15/10/2013, 07:42
 
Fecha de Ingreso: diciembre-2012
Ubicación: Murcia
Mensajes: 329
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Online y offline usuarios

Puedes hacerlo con timestamp. quiero decir que si no hay actividad dentro de la pagina en un determinado tiempo, cierre la sesión
  #3 (permalink)  
Antiguo 15/10/2013, 07:50
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Online y offline usuarios

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"
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #4 (permalink)  
Antiguo 15/10/2013, 07:53
Avatar de loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Online y offline usuarios

otro hilo
http://www.phperos.net/foro/index.php?topic=8832.0
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...
  #5 (permalink)  
Antiguo 15/10/2013, 08:05
 
Fecha de Ingreso: febrero-2012
Mensajes: 23
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Online y offline usuarios

Muchas gracias!
Efectivamente veo que es la única solución y muy funcional.
Voy programando...

Muchas gracias por vuestro tiempo!

Etiquetas: mysql, offline, sql, 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 23:19.