Insertar un contador de visitas en tu Web con PHP
En este artículo vamos a ver como añadir un contador de visitas con PHP desde 0 con el objetivo de tener un control o contabilización de las visitas diarias en tu sitio Web.
El contador de visitas será transparente al usuario. Se tratará de insertar un código que nos permitirá tener un control de las visitas que recibimos en nuestra Web teniendo en cuenta el día y la dirección IP del usuario para evitar duplicaciones en el contador, es decir, que si un usuario entra por primera vez si que se contabilizará pero si entra por segunda o tercera vez el script no hará nada.
Necesitaremos añadir una nueva tabla en la base de datos para guardar los registros de visitas. La puedes llamar «visitas» por ejemplo.
Los campos importantes de esta tabla son la fecha y la IP. En el campo fecha se guardará la fecha actual de la visita y en el campo IP la dirección IP del usuario que nos visita.
Seguidamente deberemos incorporar el código que realiza la inserción de la visita en la base de datos en nuestro footer o header. Debes insertarlo en un lugar que se visualice en cualquier parte de tu Web, para que se ejecute cada vez que se acceda.
Antes de nada, deberás conectar con tu base de datos:
$con = mysql_connect("localhost", DB_USER, DB_PASSWORD); mysql_select_db(DB_NAME, $con);
Seguidamente realizar la consulta e inserción:
$consulta_visita_real = "SELECT * FROM visitas WHERE fecha='$hoy' AND ip='".$_SERVER['REMOTE_ADDR']."'"; $rs_visita_real = mysql_query($consulta_visita_real, $con); if (mysql_num_rows($rs_visita_real) == 0) { $hoy = date("Y-m-d"); $insert_real = "INSERT INTO visitas (ip, fecha, num) VALUES ('".$_SERVER['REMOTE_ADDR']."', '$hoy', 1)"; mysql_query($insert_real, $con); }
Como vemos, lo que estamos haciendo es observar si el visitante que está en linea es la primera vez que nos visita hoy, si es así añadimos un nuevo registro, en caso contrario el script no hará nada.
Luego en otro archivo podemos visualizar con una tabla el número de visitas que se tienen cada día:
$query = mysql_query("SELECT DISTINCT(fecha) FROM visitas ORDER BY fecha DESC", $con); if (mysql_num_rows($query) > 0) { echo '<table border="1" width="250px" cellpading="5px" cellspacing="5px">'; echo '<tr><td>FECHA</td><td>VISITAS</td></tr>'; while ($row = mysql_fetch_array($query)) { $current_date = $row['fecha']; $query_visitas = mysql_query("SELECT COUNT(*) as num FROM `visitas` WHERE fecha = '$current_date'", $con); $row_visits = mysql_fetch_array($query_visitas); echo '<tr><td>'.$current_date.'</td><td align="right">'.$row_visits['num'].'</td></tr>'; } echo '</table>'; }
En el código anterior consultamos a la base de datos el número de visitas que se tienen a diario. Veremos algo como lo siguiente:
$hoy = date(«Y-m-d»);
$ip=$_SERVER[‘REMOTE_ADDR’];
$revisar = mysqli_fetch_assoc(mysqli_query($con, «select id from visitas where fecha = ‘$hoy’ and ip=’$ip'»));
if($revisar)
{
$id=$revisar[‘id’];
mysqli_query($con,»UPDATE visitas SET numero = numero+1 WHERE id=’$id'»);
}
else
{
$sqli = «INSERT INTO visitas(ip, fecha) VALUES (‘$ip’,’$hoy’)»;
mysqli_query($con,$sqli);
}
tome el ejemplo original y de cristian, lo hice de esta forma yo al insertar no agrego el numero =1 porque cuando hice la bd por default es 1
Muy buen post, sobre todo porque la explicación es entendible y valiosa para todos quienes quieran aprender más sobre esto
Saludos
Nico
Funcionar funciona, pero lo de no mandar un registro nuevo si la ip a repetido el mismo dia no funciona…
acabo de instalarlo, he cambiado 2 o 3 veces de pagina dentro de la misma web, y me ha reescrito tantas veces como he cambiado. y mi ip es fija.
asi no son visitas reales, lo que esta contando, son clicks
Hola Jose aguilar acabo de implementar tu solcuion en mi stio web y funciona perfecto, la unica observacion que puedo aportar es que mediante esta instruccion adicional que coloca aca podemos monitorear cuantas veces ese mismo usuario ha visitado el sitio web:
else{
$rw=mysqli_fetch_array($rs_visita_real);
$id_visitante=intval($rw[‘id_visita’]);
$num=intval($rw[‘num’]);
$num=$num+1;
$update_visita=»UPDATE visitas SET num = ‘.$num.’ WHERE `visitas`.`id_visita` = «.$id_visitante;
mysqli_query($con,$update_visita);
}
CONTRA:Lo malo que estara siempre escribiendo en la base cuando se haga una visita sea nueva o vieja,
PRO: Nos puede servir como indicativo de si estan volviendo a visitar el sitio y cuantas veces, agregando un par de lineas mas podremos saber inclusive que paginas estan visitando.
Informacion adicional: $_SERVER[‘REMOTE_ADDR’] con esto obtenemos la IP por el cual estan saliendo los request osea me di cuenta que al final ese codigo logra obtener el IP del router en el que estamos conectados varios dispositivos en la casa pero no los logra detectar a los disposivos si no a la ip del router, sabes su hay alguna manera de obtener todos los ips de los dispositivos?
jejejejejeje hay que reconocer que el amigo jose aguilar hace las cosas tam simples que cuesta creer que funcionen hasta que pruebas y es cierto…
te felicito amigo, más claro y facil no se puede…
Bueno el artículo y muy claro le felicito, todo sale bien solo que registra varias veces al actualizar la página.
Jose cómo se podría arreglar, el código es bien simple y funciona
gracias.
Hola,
Revisa que no estés haciendo el INSERT dos veces. En el código del ejemplo no estamos observando la inserción 2 veces.
Saludos
Hola me sale el siguiente error:
Notice: Undefined variable: hoy in header.php on line 209
Hola buenas noches quisiera poner esto en wordpress como podría hacerlo??
Hola buenos días,
Deberá modificar su wordpress añadiendo esta nueva tabla de visitas y por ejemplo en footer.php o en el functions.php hacer la función que registra las visitas.
Saludos
yo copeo y pego el codigo, creee tambien la base de datos y me sale errores
Buenas, perdon por la ignorancia, pero ese codigo donde tengo que insertarlo? yo pegué las tres partes del codigo en un archivo .php y lo agregué a mi index mediante include()… por lo visto lo hice mal porque me salto error en todas las lineas… Gracias por la ayuda!
Hola buenas tardes, no se debe poner todo en un mismo archivo. En el artículo estoy comentando todos los pasos.
Hola me podrías explicar o dar un ejemplo de como hacer para q´ no agregue una visita más actualizando la pagina?,. por más que tenga la misma IP gracias.
Hola en principio en el siguiente código implícito en el artículo ya se está controlando el caso que comentas:
$consulta_visita_real = «SELECT * FROM visitas WHERE fecha=’$hoy’ AND ip='».$_SERVER[‘REMOTE_ADDR’].»‘»;
$rs_visita_real = mysql_query($consulta_visita_real, $con);
if (mysql_num_rows($rs_visita_real) == 0) {
$hoy = date(«Y-m-d»);
$insert_real = «INSERT INTO visitas (ip, fecha, num) VALUES (‘».$_SERVER[‘REMOTE_ADDR’].»‘, ‘$hoy’, 1)»;
mysql_query($insert_real, $con);
}
Primero estamos haciendo una consulta para revisar si en el día de hoy la ip del visitante ya está registrada en la tabla.
Saludos
Esta interesante el sistema de visitas, sin embargo, debo decir que cada que se recarga la pagina cuenta como visita. asi sea el mismo ip. al menos eso es lo que ocurre en mi localhost
Eso se puede controlar creando una tabla extra para registrar las ip y condicionar la inserción en la tabla de visitas solo si no existe su ip en el día.
capaz te realize eso pero seria por fecha.. si haces por ip.. solamente 1 vez va a contar tu visita por mas que entres todos los dias.. ya que eso se guardo en tu base de datos.. para mi funciona super bien
si, me refería a eso. Tener una tabla extra con:
id_visita
ip
fecha
En esta tabla solo registrarás si la ip no está en la fecha de hoy.
Saludos
el mas fácil que he visto para copiar y pegar practicamente
esta genial!!
Por favor sabrás, donde es recomendable colocar un contador en una tienda elaborada con oscommerce?
En la cabecera o en el pie de página. También en una de las columnas estaría bien.
Estimado, esta demasiado bueno el contador, lo que si me queda una duda, como se puede hacer para capturar la url que esta mostrando el navegador ??
Saludos !
Posiblemente te puede servir esto:
http://www.jose-aguilar.com/blog/obtener-url-actual-con-php/
Saludos
Felicitaciones por su portal, excelente información me ha servido mucho, es una manera de mejorar notablemente nuestra web y tener un mejor control.
FUNCIONA!!
Muy chulo , te falta creo un update num para evitar tanto registro