Ver Mensaje Individual
  #4 (permalink)  
Antiguo 02/09/2014, 05:23
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta 2 tablas

@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
  1. $limite = $date-$time*60 ;
  2.  
  3. // si se supera el tiempo limite (5 minutos) lo borramos
  4. 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
  1. // Tiempo máximo de espera
  2. $time = 5 ;
  3.  
  4. // Momento que entra en línea
  5. $date = time() ;
  6.  
  7. // Tiempo Limite de espera
  8. $limite = $date-$time*60 ;
  9.  
  10. 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 original
  1. echo "delete from gente_online where date < '".date("Y-m-d H:i:s",$limite)."'";
Eso devolverá:
Código SQL:
Ver original
  1. DELETE 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 original
  1. if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARTDED_FOR'] != '') {
  2.     $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
  3. } else {
  4.     $ip_address = $_SERVER['REMOTE_ADDR'];
  5. }
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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/09/2014 a las 05:35