jueves, 4 de diciembre de 2008

Video Tutorial - Contador de visitas UNICAS con PHP


Continuando con la tanda de contadores, he decidido publicar la implementacion de un contador de visitas únicas. "Visita unica" significa que un usuario que entra a la pagina web por segunda, tercera o cuarta vez, etc. No es tomado en cuenta por el contador, ya que la primera vez que el usuario ingreso ya fue registrada su visita.

Este tipo de contadores permite acercarnos mucho mas a la realidad actual de nuestra pagina web, ya que en el caso de los contadores simples, la informacion que estos registran no puede ser confiable dado que pueden ocurrir recargas de paginas, visitas repetidas, etc. Y estas no son diferenciadas por los contadores estandar.

Para empezar el tutorial debemos crear una BD en MySQL llamada "contador_visitas_unicas", en esa base de atos vamos a agregar la siguiente tabla:

CREATE TABLE `visitas` (
`id` int(4) unsigned NOT NULL auto_increment,
`direccion_ip` varchar(16) default NULL,
`fecha` date NOT NULL default '0000-00-00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;
Como pueden ver, la tabla contiene tres campos: ID, Direccion IP y Fecha. Vamos a enfocarnos en los ultimos dos datos, dado que el primero no es realmente necesario. En el campo Direccion IP de esta tabla, es donde vamos a almacenar el identificador unico de cada computadora (su IP).

Tambien vamos a usar una columna llamada "Fecha" donde vamos a registrar el dia en que fue almacenada la ip, ya que las visitas unicas son por dia, si el ultimo registro fue hace mas de un dia, entonces podemos volver a regstrarlo.

Debemos entonces conectarnos a la base de datos, para eso vamos a crear un archivo llamado conexion.php que vamos a importar a la página con la funcion "require()" donde estemos desarrollando y necesitemos conexion con la base de datos:

Código conexion.php



<?php

/* conexion ****************/

// conectamos al servidor MySQL

$link = mysql_connect('localhost', 'root', '');

if(!$link) {

die("Error al intentar conectar: ".mysql_error());

}

// seleccionamos la base de datos

$db_link = mysql_select_db('contador_visitas_unicas', $link);

if(!$db_link) {

die('Error al intentar seleccionar la base de datos'. mysql_error());

}

/* fin conexion ************/


?>

Una vez realizada la conexion, debemos crear el archivo "contador.php", en este archivo esta toda la logica de la página:

Código conexion.php

<?php

//Sript hecho por Alejandro Sanchez

//www.internetdeveloping.blogspot.com


//Me conecto a la BD

require('conexion.php');


//Devuelve el numero de visitas a partir de una fecha en especifico

function contarVisitas($aniodesde, $mesdesde, $diadesde )

{

$sql="select count(*) from visitas

where fecha >= '$aniodesde-$mesdesde-$diadesde'";

$result= mysql_query($sql);

if($row = mysql_fetch_array($result))

{

return $row[0];

}

else

return(0);

}


//Imprime todas las visitas

function imprimirVisitas()

{

$sql="select direccion_ip, fecha from visitas";

$result= mysql_query($sql);

while($row = mysql_fetch_row($result))

{

echo "fecha: " . $row[1] . " | Direccion ip ---> " . $row[0] . "<br>";

}

}


//Esta funcion solo registra una visita si ese mismo dia el usuario no ha entrado ala pagina

function registrarVisita($IDUSER)

{

/* --------------------------------------------------

Primero hacemos una consulta para ver si ese mismo

usuario ya está registrado el día de hoy.

------------------------------------------------- */

$sql="select * from visitas

where direccion_ip='$IDUSER'

and fecha=CURDATE()";


$result= mysql_query($sql);



if(mysql_num_rows($result)==0) // Registrar la visita

{

$sql="INSERT INTO visitas VALUES(NULL,'$IDUSER',CURDATE())";



mysql_query($sql);

}

}


registrarVisita($_SERVER [ 'REMOTE_ADDR' ]);

?>

<style type="text/css">

<!--

.style6 {font-size: 24px;

font-family: Georgia, "Times New Roman", Times, serif;

font-weight: bold;

}

-->

</style>

<table width="74%" border="0" align="center" cellpadding="0" cellspacing="0">

<tr>

<td><p>&nbsp;</p>

<p>Contador de visitas unicas, los visitantes repetidos seran ignorados, hasta el dia siguietne.</p></td>

</tr>

<tr>

<td height="170" align="center" valign="middle"><p align="left"><br />

<br />

</p>

<?php

echo "Hasta ahora haz recibido un total de ".contarVisitas(2007, 10, 03 )." visitas unicas por dia";

echo "<BR><BR>Detalles de visitas: <br>";

imprimirVisitas();

?>

<p align="left"></p>

<p align="center">Alejandro Sánchez - <a href="http://internetdeveloping.blogspot.com/">http://internetdeveloping.blogspot.com/</a></p></td>

</tr>

</table>

En este archivo podemos destacar principalmente tres funciones:
  • contarVisitas(Año, Mes, Dia), recibe una fecha y devuelve todas las visitas unicas que han habido en la página desde esa fecha:
Para realizar esa consulta debemos utilizar las funciones mysql_query y mysql_fetch_array que nos proporciona el framework de PHP.
  • imprimirVisitas() Imprime el IP y la fecha de todas las visitas unicas que ha tenido la pagina hasta la fecha.
  • registrarVisita(Direccion IP), esta es la funcion mas importante, primero realiza una consulta en la base de datos sobre el usuario con la IP proporcionada en los parametros de la funcion y cuya fecha sea del mismo dia que hoy. Si el resultado de esta consulta es vacio entonces se procede a insertar al usuario, de lo contrario no se hace nada, porque ya el usuario fue registrado en otra visita anterior en este dia.
A continuación les dejo un video tutorial con todo lo que acabo de explicar durante este tutorial, cualquier duda no duden en escribir! estamos para servir! :) aalejo@gmail.com.



Tambien les dejo el codigo fuente y un ejemplo funcionando:

5 comentarios:

  1. Muy buen tutorial, es una pasada, lo unico si se pudiera cambiar que se actualicen las visitas cada 15 minutos y no cada 24 seria una paada para un proyecto personal que estoy realizando.

    ResponderEliminar
  2. a mi me da error parse( de coma ) en la linea 10 de conexion php. alguien sabe algo?

    ResponderEliminar
  3. oye gracias, es perfecto y funciona al cien jejejejeje

    saludos

    ResponderEliminar
  4. Saludos Alejandro, te saluda José Ricardo de Perú, en realidad quiero agradecerte enormemente por compartir tus conocimientos, aunque no soy un experto en PHP, veo que el contenido de tus ejemplos son enormemente un esfuerzo propio de tu parte, sigue así amigo Alejandro, por otra parte, mi inquietud era si tú podrias desarrollar un Sistema de Matrícula para los estudiantes de la Facultad en la que yo estudio (Facultad de Educación y Humanidades), claro que previo a eso tendriamos que coordinar todo lo respecto a los costos que demandaria ello, de antemano te agradezco si me das una respuesta. Mi correo electronico es pepesolucion@hotmail.com

    ResponderEliminar
  5. Muy bueno el tutorial. Es el día de hoy que sigo pensando si esto no ralentiza el servidor y es conveniente usar un contador externo, aunque la mayoría de los contadores externos gratuitos no informan lo que realmente quiero...

    ResponderEliminar