entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

como se crea un contador de visitas

necesito que mi pagina pueda contar las visitas y registrar las ips y el tiempo que trascurre cada usuario, quiero que mi contador incremente solo si la ip no se repiten.
me gustaria que fuera algo sencillo facil de entender.

1 Respuesta

3votos

Leonardo-Tadei Puntos211470

Hola @algoritmico,

De la variable de entorno $_SERVER['REMOTE_ADDR'] podés acceder a la IP del que visita la página, luego, bastaría ir cargando las IPs en una tabla de base de datos, junto con la fecha de la visita.

Ahora tenés que decidir algo: si yo navego siempre desde la misma IP, contaré como una visita una vez y luego nunca más? Al menos eso quiere decir tu planteo de que el "contador se incremente solo si la IP no se repite".

Esto es poco útil, porque se acostumbra a que si yo volviese otro día, vuelva a contar como una visita, para lo que tenés que decidir, en caso de que mi IP ya esté, cuanto tiempo considerás que debe pasar entre 2 visitas para que se considere una nueva.

Esto implica que antes de agregar una IP, hay que ver si existe, y en base a la fecha de la última visita, ver si se agrega un registro o si no hace falta porque es la misma visita.

Saber cuántas visitas son, luego de determinado qué es una visita, es nada más contar la cantidad de registros en 2 fechas (por eso comencé hablando de la tabla de base de datos, en donde hacer este cálculo es simple).

Luego otra consideración: si hay 20 personas navegando en una oficina o en un cibercafé, todos serán la misma IP, por lo que tu contador no dará un buen resultado en ese caso (aunque la diferencia real en un sitio con muchas visitas no es significativa).

Por último, el tiempo que está un usuario visitando el sitio no se puede determinar, ya que no tenés cómo registrar que se abandona el sitio. La única manera de hacer esto es para usuarios registrados que hayan iniciado sesión, en cuyo caso podés registrar el logout o intentar adivina cuándo abandonó el sitio la próxima vez que entre...

Como ves, el problema que planteás es amplio y complejo, por lo que las soluciones en general no serán fáciles de entender...

Te dejo un enlace con un ejemplo de implemetación de todo esto. Comprender primero bien el problema ayuda a que el código sea fácil de entender.

Saludos cordiales!

PD: los proveedores de hosting generalmente proveen estadísticas de visitas basadas en los LOG del servidor. También tenés el [muy intrusivo] Google Analitics que ofrece esto como servicio gratuito [y lo que está a a venta son tus datos]. Tenés una versión de software libre muy similar a Analitics llamada Piwik, en este caso no tenés que aprender a programarla sino a instalarla e incluirla en tu sitio.

steven comentado Dic 23, 2016

resumiendo lo que entendi debo hacer el siguiente procedimiento
1.almacenar las direcciones en un db
se podria tambien guardar en un fichero de texto las direcciones y las fechas
2.definir un tiempo para que el contador vuelva a contar las visitas del mismo visitante.
mi opcion es dejar que pasen 24h,
3.si se tratara de un red publica como un cybercafe, se podria identificar el sistema y el navegador de este modo se podria saber si se trata de un usuario distinto.
pero a raiz de esto creo que la mayoria de las ips contarian con mas de un equipo, claro tampoco quiere decir que todos navegen por mi pagina.

en conclusion debo de crear el script que guarde las ips y embeberlo en mi index

Leonardo-Tadei comentado Dic 23, 2016

  1. Es extremadamente complicado recuperar y editar un dato en un archivo de texto. Yo te lo desaconsejo.

  2. En el ejemplo de implementación que te pongo en el enlace se considera una nueva visita cada 5 horas: cambialo a 24hs y ya tenés casi todo, adaptación más, adaptación menos.

  3. Distinguir además del la IP al navegador te dará más exactitud, pero complica un poco más el código. Además en las oficinas todos los equipos suelen tener el mismo navegador.

Para la implementación, deberías poner esto al principios e todas las páginas, y no solo del index, para que mida las visitas al sitio, independientemente de por dónde se entre o en dónde se esté.

Saludos cordiales

steven comentado Dic 23, 2016

hay todavia algunas dudas, debo guardar la ip en un formato numerico decimal o entero? debo de crear un timer de 24h, debo de tener una conexion constante con la bd.
si en caso quisiera saber el total de visitas de un dia o una semana deberia de crear un codigo aparte para hacer el calculo?

Leonardo-Tadei comentado Dic 24, 2016

Hola @algoritmico,

respecto a tus dudas:

  • da lo mismo como guardes las IP. Lo único que hace falta es buscarlas en el mismo formato que se guardan.

  • no hace falta crear un timer (viste el ejemplo en el enlace en mi respuesta?) porque la query filtra por cantidad de horas.

  • no hace falta (y [casi] nunca está recomendado en entornos web) hacer conexiones persistentes a la DB.

  • para hacer cálculos o informes sobre los datos, hace falta código aparte, que tendrás que escribir según lo que quieras saber. Hay muchísimos informes posibles que se pueden extraer de estos datos.

Saludos Stevenpro97

steven comentado Dic 25, 2016

hola @Leonardo-Tadei he seguido todos los pasos pero todavia me falta mucho
he creado una tabla testeo y en el hay 3 campos
el primero un valor que autoincrementa, el segundo es un campo de tipo numerico entero para las direcciones ip
por ultimo esta el campo fecha que almacenara las fechas de las visitas

<?php
$ip = $_REMOTE_ADDRESS;
$fecha = Date
mysql_connect('localhost', 'root','');
mysql_select_db('app2.0');
$sql = "SELECT testeo INSERT TO ip=$ip, fecha=$fecha";
mysql_query($sql);
mysql_close();

 ?>

como se trabajan con las fechas, como deberia ser mi codigo gracias.

Leonardo-Tadei comentado Dic 25, 2016

Hola Stevenpro,

en un campo numérico entero no vas a poder guardar la IP...

Por qué no seguís este ejemplo, que tiene todas estas cuestiones resueltas?

Se pueden responder a dudas puntuales por este medio, pero no dar un curso de programación, por más buena voluntad que pongamos.

En tal caso, si va a preguntar por varios detalles de implementación, creá una pregunta puntual para cada uno, porque si no este hilo no se terminará jamás.

Salu2

steven comentado Dic 25, 2016

he seguido el ejemplo pero devuelve un error anomalo con el siguiente aviso

Problemas al ejecutar select SQL You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '::1' at line 1

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$db = mysql_connect('localhost', 'root','');
mysql_select_db('app2.0', $db);

$sql="select ip, TIMEDIFF(NOW(), fecha), fecha, num_visitas from testeo where ip=$ip";

//Ejecutamos la instrucción SQL

$rs=mysql_query($sql) or die("Problemas al ejecutar select SQL ".mysql_error());

/*Almacenados el resultado de la instrucción SQL en un arreglo asociativo con la función

mysql_fetch_array */

$fila=mysql_fetch_array($rs);

$tiempo=$fila[1]; //Diferencia entre fecha guardada y fecha actual

$num_visitas=$fila[3]; //Número de visitas

$horas_t=substr($tiempo,0,2); //Número de horas transcurridas

$tiemRes = 5; //Varible de tiempo en horas para restringir la visita

/*Contamos el número de registros obtenidos en la consulta anterior, si el numero

* obtenido es igual a cero es porque dicho visitante es nuevo en el sito

* entonces agregamos su ip a la base de datos junto con un 1 y la fecha actual */

if (mysql_num_rows($rs)==0)

{

$sql="insert into testeo(ip, num_visitas, fecha) values(‘$ip’, 1, NOW())";

mysql_query($sql) or die("Problemas al ejecutar la insert SQL ".mysql_error());

}

/* Si el número de registros obtenidos es mayor a cero es porque dicho visitante ha vuelto a ingresar al

* sitio, y si su tiempo transcurrido es mayor a 5 horas desde la primera vez que ingreso

* entonces actualizamos su número de votos agregando sumando 1 al valor actual,

* tambien actualizamos la fecha de su ultimo ingreso a la fecha actual

* */

//Si la ip existe y han transcurrido 5hrs

elseif (mysql_num_rows($rs) > 0 && $horas_t > $tiemRes)

{

$sql="update testeo set fecha=NOW(), num_visitas=’$num_visitas’+1 where ip=’$ip’";

mysql_query($sql) or die("Problemas al ejecutar update SQL ".mysql_error());

}

$sql="select SUM(num_visitas) from testeo"; //Obtenemos la suma de todas las visitas

$rs=mysql_query($sql) or die("Problemas al ejecutar select SQL ".mysql_error());

$fila=mysql_fetch_array($rs); //Almacenanos el resultado de la consulta en un arreglo

$num_visitas=$fila[0]; //Número de visitas

mysql_close($db);
 ?>

ademas de esto tengo un problema con mi phpmyadmin cuando quiero modificar la estructura retorna un mensaje de error
error en la elabocion
codigo del error 200
mensaje de error OK

Leonardo-Tadei comentado Dic 25, 2016

Hola Stevenpro,

el error de la query es porque la IP es un string, y te estás olvidando de ponerla entre comillas. Si no modificás primero la estructura de la tabla, evidentemente el código no funcionará.

Respecto al error en tu PHPMyAdmin, consulta en un buscador o llama a un técnico... si no es tan importante, siempre podés borrar la tabla y volver a craerla. En cualquier caso, ese no es un problema de programación.

Salu2

steven comentado Dic 26, 2016

todavia tengo un problema la ip no se guarda y en su lugar se guarda esto
::1

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$db = mysql_connect('localhost', 'root','');
mysql_select_db('app2.0', $db) or die ("error en la conexion".mysql_error());

$sql="SELECT ip, TIMEDIFF(NOW(), fecha), fecha, num_visitas FROM testeo WHERE ip='$ip'";

$rs=mysql_query($sql) or die("Problemas al ejecutar select SQL ".mysql_error());

$fila=mysql_fetch_array($rs);

$tiempo=$fila[1]; //Diferencia entre fecha guardada y fecha actual

$num_visitas=$fila[3]; //Número de visitas

$horas_t=substr($tiempo,0,2); //Número de horas transcurridas

$tiemRes = 5; //Varible de tiempo en horas para restringir la visita

if (mysql_num_rows($rs)==0)

{

$sql="INSERT INTO testeo(ip, num_visitas, fecha) VALUES('$ip', 1, NOW())";

mysql_query($sql) or die("Problemas al ejecutar la insert SQL ".mysql_error());

echo $ip; //esto imprime ::1 

}

Leonardo-Tadei comentado Dic 26, 2016

Eso correcto...

La IP ::1 es el "localhost" de IPc6. Es lo mismo que 127.0.0.1 para IPv4

Si vos estás probando en tu propia PC accediendo a localhost para ver el sitio, obtendrás esa IP como respuesta.

https://es.wikipedia.org/wiki/Direcci%C3%B3n_IPv6
https://es.wikipedia.org/wiki/Localhost

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta