Autor Tema: [SOLUCIONADO] Mostrar nombres de los usuarios en linea en un div  (Leído 5601 veces)

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
[SOLUCIONADO] Mostrar nombres de los usuarios en linea en un div
« en: 11 de Marzo de 2012, 01:00:42 am »
Tengo un Sistema de Usuarios y lo que pretendo es que todos los usuarios que estén en línea (lógicamente para estar en línea (visualizando la web) tendrán que estar registrados y logueados) aparezcan en un div en un columna en orden alfabético.

### Ejemplo: ###

     Usuarios en línea:

     Alba
     Alberto
     María
     Pedro
     Sandra

### FIN DE EJEMPLO ###


Mi idea para crear este script es la siguiente, pero quiero que lo superviséis para estar más seguro.

  • Crear una columna en la misma tabla de usuarios llamada por ejemplo status.
  • Asignarle a la columna status de la tabla usuarios el valor por defecto 0 (desconectado) ó, D (desconectado)
  • Crear el script mediante condicionales, es decir, mediante if.

    Por ejemplo:

    - si(está logueado) {actualizar en la columna status de la tabla usuarios a 1 (conectado), ó, C (conectado)} else {header(Location: index.php)}
    - seleccionar la tabla usuarios dónde obtendré la id de cada usuario.
    - muestro el nombre del usuarios en función de su id.

¿Estaría en lo correcto con mi idea?

### CÓDIGO ###

db.php
Código: [Seleccionar]
CREATE TABLE IF NOT EXISTS `online` (
  `onlineid` int(11) NOT NULL AUTO_INCREMENT,
  `onlineuser` varchar(40) NOT NULL,
  `lastdate` varchar(100) NOT NULL,
  `ip` varchar(255) NOT NULL,
  PRIMARY KEY (`onlineid`)
)

users.php
Código: [Seleccionar]
<?php
// OBLIGATORIO.
session_start();
include(&
#39;includes/conectar_db.php&#39;);
if(isset($_SESSION[&#39;user_nombre&#39;])) {
include(&#39;includes/funciones.php&#39;);
?>




<?php
//Pequeño extra de verificación de actividad del usuario

mysql_query("UPDATE online SET lastdate=&#39;".time()."&#39;,ip=&#39;".$_SERVER[&#39;REMOTE_ADDR&#39;]."&#39; WHERE onlineuser=&#39;".$_SESSION[&#39;user_nombre&#39;]."&#39;");

//Verificar usuarios online
$online "SELECT * FROM users,online";
$online mysql_query($online) or mysql_error();

while(
$user_online=mysql_fetch_array($online)){

$duracion 1*60*60;
$expira $user_online[&#39;lastdate&#39;]+$duracion;
if(time() >= $expira){
$eliminar_online "DELETE FROM online WHERE onlineuser=&#39;".$user_online[&#39;user_nombre&#39;]."&#39;";
mysql_query($eliminar_online) or die(mysql_error());
}
}
//Mostrar cantidad de usuarios
$resultado=mysql_query("SELECT COUNT(*) as total FROM online") or die (mysql_error());
$total=mysql_result($resultado,0,"total");

echo 
"Usuarios online: $total";
?>




<?php
// Fin de $_SESSION[&#39;user_nombre&#39;].
} else { header("Location: acceso.php"); }
?>

comprobar.php
Código: [Seleccionar]
<?php
    session_start
();
    include(&
#39;includes/conectar_db.php&#39;);
    
if(isset($_POST[&#39;enviar&#39;])) { // Comprobamos que se hayan enviado los datos del formulario.



//Comprobamos si ya se ha ingresado anteriormente
$online mysql_query("SELECT onlineuser FROM online WHERE onlineuser=&#39;".$_POST[&#39;user_nombre&#39;]."&#39;");
$online_exist mysql_num_rows($online);

//Si no existe ninguna coincidencia insertamos nueva conexión, de lo contrario actualizamos la conexión existente.
if($online_exist==0){
mysql_query("INSERT INTO `online` (`onlineuser`, `lastdate`, `ip`) VALUES
(&#39;"
.$_POST[&#39;user_nombre&#39;]."&#39;, &#39;".time()."&#39;, &#39;".$_SERVER[&#39;REMOTE_ADDR&#39;]."&#39;") or mysql_error();
}else{
mysql_query("UPDATE online SET lastdate=&#39;".time()."&#39;,ip=&#39;".$_SERVER[&#39;REMOTE_ADDR&#39;]."&#39; WHERE onlineuser=&#39;".$_POST[&#39;user_nombre&#39;]."&#39;") or mysql_error();
}




        
// Comprobamos que los campos user_nombre y user_clave no estén vacíos.
        
if(empty($_POST[&#39;user_nombre&#39;]) || empty($_POST[&#39;user_clave&#39;])) {
            
echo "No has introducido todo tus datos. <a href=&#39;javascript:history.back();&#39;>Reintentar</a>";
        }else {
            
// "Limpiamos" los campos del formulario de posibles códigos maliciosos.
            
$user_nombre mysql_real_escape_string($_POST[&#39;user_nombre&#39;]);
            
$user_clave mysql_real_escape_string($_POST[&#39;user_clave&#39;]);
            
$user_clave md5($user_clave);
            
// Comprobamos que los datos ingresados en el formulario coincidan con los de la base de datos.
            
$sql mysql_query("SELECT user_id, user_nombre, user_clave FROM users WHERE user_nombre=&#39;".$user_nombre."&#39; AND user_clave=&#39;".$user_clave."&#39;");
            if(
$row mysql_fetch_array($sql)) {
                
$_SESSION[&#39;user_id&#39;] = $row[&#39;user_id&#39;]; // Creamos la sesión "user_id" y le asignamos como valor el campo user_id.
                
$_SESSION[&#39;user_nombre&#39;] = $row[&#39;user_nombre&#39;]; // Creamos la sesión "user_nombre" y le asignamos como valor el campo user_nombre.
$_SESSION[&#39;ultimoAcceso&#39;]= date(&#39;Y-n-j H:i:s&#39;); // Creamos la sesión "ultimoAcceso" y le asignamos como valor date.
                
header("Location: acceso.php");
            }else {
?>

                Ha ocurrido un error. <a href="acceso.php">Reintentar</a>
<?php
            
}
        }
    }else {

        
header("Location: acceso.php");
    }
?>

logout.php
Código: [Seleccionar]
<?php
session_start
();
include(&
#39;includes/conectar_db.php&#39;); // ******
if(!empty($_SESSION[&#39;user_nombre&#39;])) {
mysql_query("DELETE FROM online WHERE onlineuser=&#39;".$_SESSION[&#39;user_name&#39;]."&#39;") or die(mysql_error()); // ******
$_SESSION = array();
session_unset();
session_destroy();
header("Location: acceso.php");
} else {
echo 
"Operaci&oacute;n incorrecta.";
}
?>

en la página de users.php me aparece Usuarios online: 0. ¿A qué se debe esto?
Le echo un vistazo a la base de datos y en la tabla de online no me inserta nada.
« Última modificación: 20 de Marzo de 2012, 22:22:17 pm por maska »

Comunidad PHPeros

[SOLUCIONADO] Mostrar nombres de los usuarios en linea en un div
« en: 11 de Marzo de 2012, 01:00:42 am »

Desconectado Humano

  • PHPerit@
  • *
  • Mensajes: 15
  • Karma: 0
  • Sexo: Masculino
  • Nuev@ PHPer@
    • Ver Perfil
    • MOPC
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #1 en: 11 de Marzo de 2012, 02:29:06 am »
Si de esa forma se puede hacer, Hay otra forma que es por secciones y cookies pero si eres un principiante(como yo) pues si esa es la mas facil.

Salu2

Desconectado -Pituko-

  • PHPero Experto
  • *****
  • Mensajes: 954
  • Karma: 20
  • Sexo: Masculino
  • ¡Hala Madrid!
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #2 en: 11 de Marzo de 2012, 05:38:10 am »
Si de esa forma se puede hacer, Hay otra forma que es por secciones y cookies pero si eres un principiante(como yo) pues si esa es la mas facil.

Salu2
¿Por sesiones y cookies? ¡Qué poco recomendable! De seguro no eres un Humano, hacerse el inteligente es fácil mi querido amigo.

La forma en que yo lo haría sería:
Crear un campo en la tabla de usuarios llamado "last_conn" y enviar (vía js y php, claro) un registro con time() cada 30 segundos. Y hago que el script de mostrar usuarios conectados muestre los usuarios con un campo "last_conn" mayores que un time (actual) - 60. No sé si me entendiste
« Última modificación: 11 de Marzo de 2012, 05:46:07 am por -Pituko- »

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #3 en: 11 de Marzo de 2012, 10:47:13 am »
¿Por sesiones y cookies? ¡Qué poco recomendable! De seguro no eres un Humano, hacerse el inteligente es fácil mi querido amigo.

La forma en que yo lo haría sería:
Crear un campo en la tabla de usuarios llamado "last_conn" y enviar (vía js y php, claro) un registro con time() cada 30 segundos. Y hago que el script de mostrar usuarios conectados muestre los usuarios con un campo "last_conn" mayores que un time (actual) - 60. No sé si me entendiste
Me gustaria saber porque actualizas cada equis segundos. Supongo que sera para ver si esta activo o no. Supongo que seria para ver si esta activo, ¿No? Es decir, si el tiempo transcurrido=(hora actual)-(hora de conexion en linea) y si esto es >= que equis segundos, pues el usuario se desconecta.
¿Esa es la idea?

PD: Gracias a los dos por contestar.

Lo que si me gustaria añadir y es que si tengo la sesiones para que me caduquen a los 15 minutos de inactividad, es decir, que de destruya la session y salga de la pagina, ¿Vale la pena caducar la inactividad en linea del usuario? Porque se entiende de que si no esta activo en la pagina a los 15 minutos la session se cerrara y en el div de usuarios en linea aparecera como usuario desconectado.

De todas formas me gusta que comenten para solventar las dudas.

Saludos y gracias.

Desconectado Humano

  • PHPerit@
  • *
  • Mensajes: 15
  • Karma: 0
  • Sexo: Masculino
  • Nuev@ PHPer@
    • Ver Perfil
    • MOPC
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #4 en: 11 de Marzo de 2012, 12:30:53 pm »
Pituko leiste la oracion completa yo no dije que lo hisiera como yo diga, yo solo le dije una recomendacion. Asi es como a una persona se le quitan las ganas de ayudar.

Salu2.

Desconectado Animus

  • PHPero Avanzado
  • ****
  • Mensajes: 273
  • Karma: 1
  • Sexo: Masculino
  • Aprende a aprender, el resto vendrá solo.
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #5 en: 11 de Marzo de 2012, 12:58:53 pm »
Está bien planteado, pero ya lo que es caducidad en las sessiones me complica, por que no logro entender si tengo que editar eñ archivo de configuración de PHP o mediante alguna función :/ ..



La red social de tus sueños.


Desconectado -Pituko-

  • PHPero Experto
  • *****
  • Mensajes: 954
  • Karma: 20
  • Sexo: Masculino
  • ¡Hala Madrid!
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #6 en: 11 de Marzo de 2012, 16:11:31 pm »
Pituko leiste la oracion completa yo no dije que lo hisiera como yo diga, yo solo le dije una recomendacion. Asi es como a una persona se le quitan las ganas de ayudar.

Salu2.
No importa, a veces contesto así, perdona. Yo a lo que me refería es que no conozco ninguno que se haga con session o cookie y si existiera pues no sería muy bueno :/.

Me gustaria saber porque actualizas cada equis segundos. Supongo que sera para ver si esta activo o no. Supongo que seria para ver si esta activo, ¿No? Es decir, si el tiempo transcurrido=(hora actual)-(hora de conexion en linea) y si esto es >= que equis segundos, pues el usuario se desconecta.
¿Esa es la idea?

PD: Gracias a los dos por contestar.

Lo que si me gustaria añadir y es que si tengo la sesiones para que me caduquen a los 15 minutos de inactividad, es decir, que de destruya la session y salga de la pagina, ¿Vale la pena caducar la inactividad en linea del usuario? Porque se entiende de que si no esta activo en la pagina a los 15 minutos la session se cerrara y en el div de usuarios en linea aparecera como usuario desconectado.

De todas formas me gusta que comenten para solventar las dudas.

Saludos y gracias.
Exacto, así es.

Con lo de la inactividad podrías probar en que al hacer un click en js se guarde una variable con el tiempo actual y al hacer otro click compare la variable con el tiempo actual, si es 15 minutos menor lo llevas a una página que cierre su sesión y si no: creas otra variable.
No sé si me entendiste, si no lo hiciste coméntalo para que te de un ejemplo.
« Última modificación: 11 de Marzo de 2012, 16:15:21 pm por -Pituko- »

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #7 en: 11 de Marzo de 2012, 16:39:59 pm »
No importa, a veces contesto así, perdona. Yo a lo que me refería es que no conozco ninguno que se haga con session o cookie y si existiera pues no sería muy bueno :/.
Exacto, así es.

Con lo de la inactividad podrías probar en que al hacer un click en js se guarde una variable con el tiempo actual y al hacer otro click compare la variable con el tiempo actual, si es 15 minutos menor lo llevas a una página que cierre su sesión y si no: creas otra variable.
No sé si me entendiste, si no lo hiciste coméntalo para que te de un ejemplo.

Muchas gracias. Lo tendré en cuenta.
Pronto pondré el código para comentarlo entre todos.

Saludos.

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #8 en: 11 de Marzo de 2012, 21:29:24 pm »
Actualicé mi código. Echarle un vistazo y testearlo porque tengo dudas.

Gracias.

Desconectado B4nDidO

  • PHPer@
  • **
  • Mensajes: 58
  • Karma: 0
  • Sexo: Masculino
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #9 en: 13 de Marzo de 2012, 14:21:41 pm »
¿Se supone que ahora va?
Rock News

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #10 en: 13 de Marzo de 2012, 20:09:22 pm »
A mi no. Por eso trato de buscar ayuda. No me inserta los datos en el phpmyadmin.

Desconectado MEJORENHO

  • PHPer@ Fijo
  • ***
  • Mensajes: 204
  • Karma: 3
  • Sexo: Masculino
    • Ver Perfil
    • Beeme
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #11 en: 20 de Marzo de 2012, 03:36:22 am »
A mi no. Por eso trato de buscar ayuda. No me inserta los datos en el phpmyadmin.

Una solución para buscar el error es mysql_error()..

Mira, en el Insert o Update que dices que no se inserta, ponle detras or die(mysql_error());

Ej:

Código: [Seleccionar]
mysql_query("Update usuario set status = '1' where usuario = '".$user['nick']."'")or die mysql_error());
Si el error que te da no lo entiendes, o no sabes como arreglarlo, pega aquí el error para que te podamos ayudar.

Un saludín.

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #12 en: 20 de Marzo de 2012, 18:46:43 pm »
Una solución para buscar el error es mysql_error()..

Mira, en el Insert o Update que dices que no se inserta, ponle detras or die(mysql_error());

Ej:

Código: [Seleccionar]
mysql_query("Update usuario set status = '1' where usuario = '".$user['nick']."'")or die mysql_error());
Si el error que te da no lo entiendes, o no sabes como arreglarlo, pega aquí el error para que te podamos ayudar.

Un saludín.

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2

Eso me pone.

Desconectado maska

  • PHPer@ Fijo
  • ***
  • Mensajes: 126
  • Karma: 2
  • Nuev@ PHPer@
    • Ver Perfil
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #13 en: 20 de Marzo de 2012, 18:50:28 pm »
Ya pude solucionar el error.

Me faltaba un paréntesis en ésta línea:

mysql_query("INSERT INTO `online` (`onlineuser`, `lastdate`, `ip`) VALUES ('".$_POST['user_nombre']."', '".time()."', '".$_SERVER['REMOTE_ADDR']."')") or die(mysql_error());

Desconectado MEJORENHO

  • PHPer@ Fijo
  • ***
  • Mensajes: 204
  • Karma: 3
  • Sexo: Masculino
    • Ver Perfil
    • Beeme
Re:Mostrar nombres de los usuarios en linea en un div [AYUDA]
« Respuesta #14 en: 20 de Marzo de 2012, 18:52:01 pm »
Ya pude solucionar el error.

Me faltaba un paréntesis en ésta línea:

mysql_query("INSERT INTO `online` (`onlineuser`, `lastdate`, `ip`) VALUES ('".$_POST['user_nombre']."', '".time()."', '".$_SERVER['REMOTE_ADDR']."')") or die(mysql_error());

Me alegro de que así sea. Estas cositas nos pasan a todos jeje.