Comunidad PHPeros
Lenguajes => PHP => Mensaje iniciado por: Animus en 23 de Marzo de 2012, 09:59:14 am
-
estoy desarrollando una funciona, de online, y no online, para eso actualizo el estado a 1 del usuario bien, mi problema es cuando no d a al boton desconectar, simplemente se desconecte :X
-
Si no se desconecta explicitamente debes comprobar la hora de su ultima actividad (visita, no inicio de sesion) y si es inferior a X tiempo (15 minutos, 1 hora, etc.), "desconectarlo" ;)
-
Usa time()
-
Usa time()
*Aplausos*
Che tu, bien que hay que usar el buscador, pero ahórrate comentarios como ese.
Tal y como ha dicho SoyJoaquin, usa time, utiliza en cada archivo, yo uso un mismo archivo para conectarme por todos, cosa que me da ventaja a la hora de hacer este tipo de cosas, cada vez que el usuario navegue por una categoria o refresque la misma pagina se le añada un tiempo a su campo "time" o como lo quieras llamar. Luego, en el archivo base de la web, donde todo el mundo se conecta, y asi se reproduce y ejecuta el codigo PHP que siempre esta, pones que si un usuario que tiene MENOS de ese TIME (al tener menos significa que no ha navegado mas por la web y no ha aumentado el tiempo) cambie su estado de online a offline (1 por 0).
-
*Aplausos*
Che tu, bien que hay que usar el buscador, pero ahórrate comentarios como ese.
Tal y como ha dicho SoyJoaquin, usa time, utiliza en cada archivo, yo uso un mismo archivo para conectarme por todos, cosa que me da ventaja a la hora de hacer este tipo de cosas, cada vez que el usuario navegue por una categoria o refresque la misma pagina se le añada un tiempo a su campo "time" o como lo quieras llamar. Luego, en el archivo base de la web, donde todo el mundo se conecta, y asi se reproduce y ejecuta el codigo PHP que siempre esta, pones que si un usuario que tiene MENOS de ese TIME (al tener menos significa que no ha navegado mas por la web y no ha aumentado el tiempo) cambie su estado de online a offline (1 por 0).
*Aplausos*
Che tu, bien que hay que usar el buscador, peo ahorrate ese comentario...
Y digo lo mismo que tu, y aplaudo tu iniciativa de usar un archivo para conectar todos...
Vamos a ver, todos usamos un core donde metemos la información a la base de datos. Creo que ninguno de nosotros hacemos una conexión a la db por cada archivo.. xdddd
Otra cosa:
pones que si un usuario que tiene MENOS de ese TIME (al tener menos significa que no ha navegado mas por la web y no ha aumentado el tiempo) cambie su estado de online a offline (1 por 0).
Lol... Si haces esto de esta manera, el problema que te va a dar es que si todas las sessiones se pondrán offline...
Más que nada porque si ahora mismo el time es 21323123, dentro de un segundo será 21323124 con lo cual es menos y te pondrá off xdddd
Animus, lo que has de hacer es una funcion para restar tiempo, es decir:
Imaginate que queremos que si una persona no está presente en los últimos 10 minutos, se le ponga offline.
Hacemos esto:
60*10 = 600 con lo cual 10 minutos son 600 segundos..
Pues a la variable por ejemplo $diezminutos le asignamos 600, y creas la función con respeto a esto, por ejemplo:
En el config o el archivo en el cual se enlazan los demás debes hacer un UPDATE para que actualize el time() en el momento en que el usuario actualice la página.
Y despues pones la función para saber quien ha sigue online y quien no:
function Cambiarestado(){
//Seleccionamos todos los usuarios
$seleccionar_usuarios = mysql_query("Select * from usuario where id = '".$_SESSION['id']."'");
//Hacemos el bucle
while($usuarios = mysql_fetch_array($seleccionar_usuarios)){
//Asignamos el valor de 10 minutos en segundos, osea, 600.
$diezminutos = 600;
//Al tiempo guardado en cada columna "ultimaconexion" de la base de datos de usuarios, se le suma el valor $diezminutos.
$tiempo = $usuarios['ultimaconexion']+$diezminutos;
//Si el tiempo es igual o mayor que la variable, hacemos el update.
if($tiempo <= time()){
//Actualizamos el estado.
mysql_query("Update usuarios set estado = 'offline' where id = '".$usuarios['id']");
}
}
//FIN xd
}
A grandes rasgos creo que está bien.
Espero que esté bien jeje.
-
*Aplausos*
Che tu, bien que hay que usar el buscador, pero ahórrate comentarios como ese.
Tal y como ha dicho SoyJoaquin, usa time, utiliza en cada archivo, yo uso un mismo archivo para conectarme por todos, cosa que me da ventaja a la hora de hacer este tipo de cosas, cada vez que el usuario navegue por una categoria o refresque la misma pagina se le añada un tiempo a su campo "time" o como lo quieras llamar. Luego, en el archivo base de la web, donde todo el mundo se conecta, y asi se reproduce y ejecuta el codigo PHP que siempre esta, pones que si un usuario que tiene MENOS de ese TIME (al tener menos significa que no ha navegado mas por la web y no ha aumentado el tiempo) cambie su estado de online a offline (1 por 0).
Si te parece que con decir "Usa Time()" no esta resuelta la duda (Que según mi criterio si, ya que es la base fundamental, si le explico como hacerlo quizás el tenga otra manera, por varios caminos se llega a Roma)
Ya que tu cabeza puede que no te de para razonar mi información, seré mas claro:
Usa time(), es una función que devuelve el numero en segundos desde 1970.
Cada sistema de usuarios conectados en PHP no es "exacto", todos son relativos a un tiempo de espera, por lo general esta llega siendo de 10 a 15 minutos.
Imaginemos que en la tabla de tus usuarios tengamos un nuevo campo llamado "tiempo_conect", cuyo valor que almacenara sera el resultado del time() actual MAS el intervalo de plazo. Si usamos por ejemplo 15 minutos seria algo como:
time() + (15 * 60);
15 Seria la cantidad de minutos que se multiplicara por 60 para sacar el resultado de segundos que tiene, este valor se le sumara a lo devuelto por time();
Ahora te explico, imaginemos que "1" es conectado y "0" es desconectado, extraemos todos los usuarios que en el campo "conectado" (Campo donde se guardara si esta conectado o desconectado en tu tabla de usuarios) sea igual a "1" para comprobar si el valor almacenado en ese campo es menor al time() actual. ¿Qué pasa si llega a ser menor?, esto quiere decir que el usuario no a tenido actividad por los 15 minutos de intervalo que colocamos, por lo que procederemos a hacer un UPDATE para reemplazar ese valor "1" (Conectado) por "0" (Desconectado) en el campo "conectado" de tu tabla de usuarios.
Lo otro que tenemos que hacer, es que si el usuario entra a otra pagina o actualiza la actual, le diga a nuestro código "Hey, aun estoy aquí", Para eso primero verificamos si estamos conectado (El simple paso del isset en la SESSION del usuario) y después almacenamos nuestro time() actual mas nuestro intervalo (Ver primer ejemplo) en el campo "tiempo_conect" de nuestro usuario en la base de datos.
Un saludo.
-
Si te parece que con decir "Usa Time()" no esta resuelta la duda (Que según mi criterio si, ya que es la base fundamental, si le explico como hacerlo quizás el tenga otra manera, por varios caminos se llega a Roma)
Ya que tu cabeza puede que no te de para razonar mi información, seré mas claro:
Usa time(), es una función que devuelve el numero en segundos desde 1970.
Cada sistema de usuarios conectados en PHP no es "exacto", todos son relativos a un tiempo de espera, por lo general esta llega siendo de 10 a 15 minutos.
Imaginemos que en la tabla de tus usuarios tengamos un nuevo campo llamado "tiempo_conect", cuyo valor que almacenara sera el resultado del time() actual MAS el intervalo de plazo. Si usamos por ejemplo 15 minutos seria algo como:
time() + (15 * 60);
15 Seria la cantidad de minutos que se multiplicara por 60 para sacar el resultado de segundos que tiene, este valor se le sumara a lo devuelto por time();
Ahora te explico, imaginemos que "1" es conectado y "0" es desconectado, extraemos todos los usuarios que en el campo "conectado" (Campo donde se guardara si esta conectado o desconectado en tu tabla de usuarios) sea igual a "1" para comprobar si el valor almacenado en ese campo es menor al time() actual. ¿Qué pasa si llega a ser menor?, esto quiere decir que el usuario no a tenido actividad por los 15 minutos de intervalo que colocamos, por lo que procederemos a hacer un UPDATE para reemplazar ese valor "1" (Conectado) por "0" (Desconectado) en el campo "conectado" de tu tabla de usuarios.
Lo otro que tenemos que hacer, es que si el usuario entra a otra pagina o actualiza la actual, le diga a nuestro código "Hey, aun estoy aquí", Para eso primero verificamos si estamos conectado (El simple paso del isset en la SESSION del usuario) y después almacenamos nuestro time() actual mas nuestro intervalo (Ver primer ejemplo) en el campo "tiempo_conect" de nuestro usuario en la base de datos.
Un saludo.
(Que según mi criterio si, ya que es la base fundamental, si le explico como hacerlo quizás el tenga otra manera, por varios caminos se llega a Roma)
Toda la razón del mundo.
Mientras en mi función yo le sumo el intervalo en la comprobación sin insertarlo en la base de datos, SoyJoaquín lo está haciendo alrevés. Es decir, suma el time mas el intervalo al hacer el update, con lo cual en su función para comprobar si ha cambiado su estado solo endría que comprobar si el tiempo insertado en la base de datos es menor que el actual.
-
No todos se ponen en Offline por que solo busca los que estan en menos de ese time, los demas no los cambia.
Yo no hago una consulta en cada archivo, directamente hago de un index como un include, lo llamo todo desde el index, y se crea o no, el usuario estando en noticias.php?noticia=2&comentario=10&voto=1 sigue estando en el index, al estar siempre en el index con que navegue por otro sitio o solo con que refresque la pagina añado una cantidad al time.
<?php
// Codigo que cada vez que el usuario pasa por aquí con la session abierta aumenta +5 minutos su session.
define(???) // Define que hace que si no estoy en el index los demás archivos no sean reproducidos y aparezcan en blanco.
$paginas = array(); // No añado la modulación a este código PHP.
}
include(''.$_GET['pagina'].'.php'); // ¡Ostras! un include.
?>
No lo voy a dar todo mascadito, por supuesto, y menos aun, un código :)
-
No todos se ponen en Offline por que solo busca los que estan en menos de ese time, los demas no los cambia.
Yo no hago una consulta en cada archivo, directamente hago de un index como un include, lo llamo todo desde el index, y se crea o no, el usuario estando en noticias.php?noticia=2&comentario=10&voto=1 sigue estando en el index, al estar siempre en el index con que navegue por otro sitio o solo con que refresque la pagina añado una cantidad al time.
<?php
// Codigo que cada vez que el usuario pasa por aquí con la session abierta aumenta +5 minutos su session.
define(???) // Define que hace que si no estoy en el index los demás archivos no sean reproducidos y aparezcan en blanco.
$paginas = array(); // No añado la modulación a este código PHP.
}
include(''.$_GET['pagina'].'.php'); // ¡Ostras! un include.
?>
No lo voy a dar todo mascadito, por supuesto, y menos aun, un código :)
¿Te he pedido algún código? xddd
Eso es lo que viene siendo una modulación, y si, si se pondrían en off
Porque tu dices que si el tiempo es menor al time(), que la session estaria off.
Lógicamente el time será como mínimo 1 segundo menos al actual, con lo cual si que se pondría off.
Me estoy dando cuenta de algo que no me gusta nada de ti, y es que creo que eres un poco prepotente y aquí venimos a ayudar, no a crear post en offtopic dando las gracias a nadie por los -K. Dado que esos karmas que te restan serán porque algo no estás haciendo bien, y eso que te falla es la prepotencia.
Crees que por saber "Programar", si es que tienes un conocimiento de programador avanzado, crees que tu eres el rey del cotarro y espero que conozcas un poco a algunas personas del foro y que abras los ojos....
Lo tuyo aún tiene cura si pides perdon por las cosas que creas que has hecho mal.
Un saludin.
-
es que ahi esta el problema, si no hay session activa como desconecta una session XD?
osea, el usuario refresca una pagina, se añaden los 5 minutos a ultima conexion, cierra la ventana, ya no hay sesion abierta, ya no puedo hacer la comprobación lo que haría que se quedaría siempre en conectado, me quivoco?
-
es que ahi esta el problema, si no hay session activa como desconecta una session XD?
osea, el usuario refresca una pagina, se añaden los 5 minutos a ultima conexion, cierra la ventana, ya no hay sesion abierta, ya no puedo hacer la comprobación lo que haría que se quedaría siempre en conectado, me quivoco?
Otro usuario activo es el que lo hace.
¿Me hago entender?
-
Tengo algo de prisa en este instante pero quiero ayudarte en la medida de lo posible. He intentado explicarte el código un poco en algunas líneas del php a través de comentarios "//...".
Sería una cosa así. Tan solo que te lo he dicho con datos, seguramente, diferentes a los tuyos.
Código válido para caducar la sesión a los 30 minutos de estar el usuario inactivo en tu página. Tendras que incluirlo que todos tus archivos a través de un include si quieres que tenga resultado en todas tus páginas.
<?php
// Cálculo del tiempo transcurrido.
$fechaGuardada = $_SESSION["ultimoAcceso"];
$ahora = date("Y-n-j H:i:s");
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada));
// Comparación del tiempo transcurrido.
if($tiempo_transcurrido >= 1800) { // 30 minutos * 60 segundos = 1800 segundos. Si pasaron 30 minutos o más se destruye la sesión, si no, se actualiza a la fecha de la sesión.
mysql_query("DELETE FROM online WHERE onlineuser='".$_SESSION['user_nombre']."'") or die(mysql_error()); // Se borra el usuario online.
$_SESSION = array();
session_unset();
session_destroy();
header("Location: acceso.php");
} else {
$_SESSION["ultimoAcceso"] = $ahora;
}?>
Si lo que quieres es que al desconectarse (logout), se borre el usuario de la data base pues:
<?php
session_start();
include('includes/conectar_db.php');
if(!empty($_SESSION['user_nombre'])) {
mysql_query("DELETE FROM online WHERE onlineuser='".$_SESSION['user_nombre']."'") or die(mysql_error()); // Borrar el usuario online.
$_SESSION = array();
session_unset();
session_destroy();
header("Location: acceso.php");
} else {
echo "Operación incorrecta.";
}
?>
Si no entiendes algo, escríbeme.
Saludos.