Bueno... más de uno (2) me preguntó por el script que puse arriba... dicen que no funciona y da errores en el SQL...
Voy a hacer algunas aclaraciones:
ANTES DE PRIMERO:Crear una tabla que tenga como mínimo esta estructura:(Si no... nada va a funcionaar)...
Código:
CREATE TABLE sesiones (
usuario_nombre varchar(25) NOT NULL,
tiempo varchar(14) NOT NULL,
invitado int(1) NOT NULL
);
PRIMERO:
Si se necesita saber la cantidad de usuarios on line diferenciando cuántos son registrados y cuántos no (invitados)... pues es evidente que hay que tener antes algún sistema de autentificación y registro de usuarios... si no, todos serán invitados.
SEGUNDO:
En el script no puse las conexiones a la BD porque asumí que lo harían.. por eso sale algún error por ahí... y el script, obviamente, no funciona.
TERCERO:
Las funciones por sí solas no se ejecutan... hay que llamar a la función.
El script sería así:
Un archivo "
seguridad.php" que contiene la conexión a la BD:
seguridad.php Código PHP:
<?php
$servidor="localhost";
$usuario="tu_user";
$password="tu_password";
$base="tu_bd";
$con = mysql_connect($servidor,$usuario,$password) or die ("Error en la conexión con BD ".mysql_error());
mysql_select_db($base,$con) or die ("Error al seleccionar BD ".mysql_error());
?>
Un archivo "
funcionOnLine.php" que contiene la función:
funcionOnLine.php Código PHP:
function online(){
if (!isset($_SESSION['usuario_nombre'])){
$usuario_nombre = $_SERVER['REMOTE_ADDR'];
$invitado = 1;
}else{
$usuario_nombre = $_SESSION['usuario_nombre'];
$invitado = 0;
}
include ("seguridad.php");
$pasado = time()-900;//900 segundos. Cambiar por el plazo que se quiera dar al usuario para realizar alguna acción (recargar por ejemplo).
$sql = "DELETE FROM sesiones WHERE tiempo < $pasado";
mysql_query($sql);
$sql = "SELECT tiempo FROM sesiones WHERE usuario_nombre='$usuario_nombre'";
$result = mysql_query($sql) or die ("Error en función online (leer) :".mysql_error());
$tiempo = time();
if (mysql_num_rows($result) == 1){
$sql = "UPDATE sesiones SET usuario_nombre='$usuario_nombre', tiempo='$tiempo', invitado='$invitado' WHERE usuario_nombre='$usuario_nombre'";
}else{
$sql = "INSERT INTO sesiones (usuario_nombre, tiempo, invitado) VALUES ('$usuario_nombre', '$tiempo', '$invitado')";
}
mysql_query($sql) or die("Error en función online (actualizar) :".mysql_error);
}
Y listo... en cada página de nuestro site se debe incluir las siguientes líneas:
Código PHP:
include ("funcionOnLine.php");
online()
Hasta aquí se ha actualizado la Bd cada vez que se cargue una página... Entonces... en este punto tenemos una tabla en la Bd con todos los visitantes... sólo faltaría mostrarlos en pantalla.
En el lugar donde queremos mostrar el número de visitantes escribimos:
Código PHP:
include ("seguridad.php");//conexión con BD
$sql = "SELECT usuario_nombre FROM sesiones WHERE invitado=0";
$result = mysql_query($sql);
$total_registrados = mysql_num_rows($result);
echo "En línea:<br />";
echo "Usuarios registrados: ".$total_registrados."<br />";
while ($row = mysql_fetch_array($result)){
echo $row['usuario_nombre']."<br />";
}
$sql = "SELECT * FROM sesiones WHERE invitado=1";
$result = mysql_query($sql);
$total_invitados = mysql_num_rows($result);
echo "Invitados: ".$total_invitados."<br />";
echo "Total usuarios en línea: ".($total_invitados + $total_registrados)."<br />";
Ahora sí ya debería funcionar sin problemas... Si no se tiene un sistema de autentificación de usuarios... siempre saldrá
registrados:0
invitados:(los que hayan)
Yo lo probé con el Autentificator (de Cluster) y funciona bien sólo que habría que cambiar el nombre de las variables de sesion $_SESSION['usuario_nombre'] por $_SESSION['usuario_login']... Cada uno lo adapta a sus necesidades y a su sistema de autentificación.
Espero que ahora sí haya quedado clarísimo para todos (si está como para FAQ)...
Saludos