Ver Mensaje Individual
  #14 (permalink)  
Antiguo 29/11/2003, 01:39
Avatar de jpinedo
jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 2 meses
Puntos: 41
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

Última edición por jpinedo; 29/11/2003 a las 01:43