@jotacheca: Evidentemente no has entendido que en los foros de Bases de DAtos (incluyendo el de MySQL), no se permite postear códigos de programación. Las explicaciones del caso están en el link que te pasé anteriormente.
Basandome en eso y en una de esas normas, procedo a
mover tu post al Foro de PHP para evitar tener que borrar nuevamente el código no SQL, y evitar de esa forma que tu planteo pierda sentido (sin el PHP, no se entenderían tus problemas).
Ahora bien, hay al menos un error conceptual referido al uso de SQL embebido en PHP, y otro sobre el uso de ciertas variables de entorno de PHP...
Empecemos por esto:
Código PHP:
Ver original$limite = $date-$time*60 ;
// si se supera el tiempo limite (5 minutos) lo borramos
mysql_query("delete from gente_online where date < $limite") ;
Según esa parte de tu script, tu estás
suponiendo que MySQL entiende e interpreta las variables de PHP, y eso NO es así.
Siendo $límite una variable propia de PHP, su tipo de dato Date
jamás le llega a MySQL. Lo que le llega es una cadena de texto con el formato que tendría en la conversión de PHP,
que no necesariamente respeta el estandar MySQL de "AAAA-MM-DD HH:MM:SS", y que el DBMS espera.
Si yo hago correr esto en PHP 5.5.5, por ejemplo:
Código PHP:
Ver original// Tiempo máximo de espera
$time = 5 ;
// Momento que entra en línea
// Tiempo Limite de espera
$limite = $date-$time*60 ;
echo $limite;
Lo que obtengo como resultado es esto:
Cita: delete from gente_online where date < 1409656380
Como puedes apreciar, eso NO es una fecha... Pero ES lo que MySQL recibe.
¿Se entiende?
La idea central es que al crear la query
debes respetar las reglas de sintaxis de MySQL, así como los formatos de sus datos.
Para resolver eso debes usar la función date() con parametros, y además poner el valor entre apóstrofos:
Código PHP:
Ver originalecho "delete from gente_online where date < '".date("Y-m-d H:i:s",$limite)."'";
Eso devolverá:
Código SQL:
Ver originalDELETE FROM gente_online WHERE DATE < '2014-09-02 04:18:55'
que es sintacticamente correcto.
Conceptualmente, el segundo error es que estás creyendo que $_SERVER['REMOTE_ADDR'] te devuelve la IP propia de un usuario, y eso sólo te devolverá la IP pública desde donde accede, que puede estar compartida por muchísimos usuarios más. En otras palabras, te puede dar resultados erróneos.
la discusión de identificar por IP un usuario es vieja, hay muchos posts en el foro de PHP referidos a eso (consulta con el busador), y luego de tratarlo largamente se puede decir que NO, no es posible usar eso como
identificador unívoco absolutamente válido por una serie de limitaciones y restricciones largas de explicar.
Una de las razones del caso es que esa variable podrá contener la IP local de la subred, pero eso sería una dirección privada, que bien podría replicarse en diferentes servidores (ver temas de redes privadas y rango de direcciones en Wikipedia); además, es posible que si la PC está detrás de un proxy, tampoco recibas una dirección correcta.
En algunos foros proponen usar cosas como:
Código PHP:
Ver originalif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARTDED_FOR'] != '') { $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip_address = $_SERVER['REMOTE_ADDR'];
}
para resolver la ruta de IPs y determinar mejor las identidades. En ese sentido se entiende que no necesitarás solamente la IP privada, sino además la pública para determinar la identidad del usuario, lo que complica todo.
Siempre seguirá siendo mejor usar la combinación username+password para que se identifique... Y eventualmente el ID de la sesión que genera. Pero esa IP sola no sirve de forma segura.