PHP: Seguimiento de estadisticas de un sitio web (Tracking)
24 diciembre 2012 28 comentarios
¿Que es el tracking?
El tracking (rastreo) se refiere a llevar el seguimiento de los visitantes de tu sitio web. Aunque también puedes llevar tracking de los boletines de emails enviados a tus visitantes registrados, obvio, si es que mandas boletines en tu sitio web. El tracking se logra guardando en la base de datos ciertos datos del visitante.
Después de un tiempo se irán generando datos de los visitantes (o de los clicks) y con ellos podemos llevar algunas estadísticas como; las paginas mas visitadas, cuantos visitantes tenemos por día, mes o año, etc.
Los datos a guardar en el tracking
En este ejemplo aplicaremos tracking a un sitio web y los datos que guardaremos serán los siguientes:
- El nombre de la pagina web.
- El nombre de la pagina de donde viene el usuario.
- la dirección IP.
- El nombre del navegador.
- Fecha y hora de la visita.
Cada vez que el visitante navegue por una pagina se guardaran en una tabla de mysql los datos anteriores. Esto lo lograremos incrustando un sencillo script en cada pagina que deseemos darle seguimiento. Los primeros cuatro datos los tomaremos del array global $_SERVER[ ]. Este arreglo contiene información muy interesante acerca del servidor y de la computadora del usuario. El quinto dato lo conseguiremos con la funcion now() de MySQL.
Para que entiendas mejor el ejemplo a continuacion te muestro una imagen con la estructura de los principales archivos que utilizare:
El archivo index.html unicamente contiene los links a cada una de las paginas a las que se les desea dar seguimiento y un enlace al resumen del tracking.
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link REL="SHORTCUT ICON" href="img/tux_icon.ico"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Test Tracking Sitio Web :: Inicio</title> <link rel="stylesheet" href="css/estilos.css" type="text/css" /> </head> <body> <h2>Prueba de Tracking</h2> <p><a href="pagina1.php">Visitar Pagina1</a></p> <p><a href="pagina2.php">Visitar Pagina2</a></p> <p><a href="pagina3.php">Visitar Pagina3</a><br/><br/></p> <p><a href="tracking_paginas.php">Ver Estadisticas</a></p> </body> </html>
Diseño de la Base de datos
/* Crear BD */ CREATE DATABASE prueba; /* Crear la tabla */ CREATE TABLE `tbl_tracking` ( `id_tracking` int(11) NOT NULL auto_increment, `tx_pagina` varchar(70) NOT NULL default '', `tx_paginaOrigen` varchar(200) NOT NULL default '', `tx_ipRemota` varchar(15) NOT NULL default '', `tx_navegador` varchar(255) NOT NULL default '', `dt_fechaVisita` date NOT NULL default '0000-00-00', PRIMARY KEY (`id_tracking`) ) AUTO_INCREMENT=1 ;
Como vez únicamente se usara una tabla (tbl_tracking) para guardar el tracking de todas las paginas, esto lo hago así para mantener sencillo y fácil de entender este ejemplo. A mi parecer el nombre de cada campo es lo suficientemente descriptivo como para no tener que explicarte que dato guardara, déjame un comentario si no es así.
El script que guarda el tracking
guardaTracking.php
<?php /* Script que se conecta a la BD y guarda informacion de la pagina que se esta visitando e informacion del visitante. Debe insertarse en cada pagina que se desea darle seguimiento. Author: Gonzalo Silverio gonzasilve@gmail.com Fuente: https://gonzasilve.wordpress.com Archivo: guardaTracking.php */ //conectar la BD include("conectar_bd.php"); conectar_bd(); //Recuperar informacion del visitante $tx_pagina = $_SERVER['PHP_SELF']; //nombre de la pagina web actual $tx_paginaOrigen = $_SERVER['HTTP_REFERER'];// Pagina web de donde viene el visitante $tx_paginaActual = $_SERVER['PHP_SELF']; //nombre de la pagina web actual $i_direccionIp = $_SERVER['REMOTE_ADDR']; // Direccion Ip del visitante $tx_navegador = $_SERVER['HTTP_USER_AGENT']; // Nombre del navegador //Insertar los datos del visitante... $tx_qryInsert ="INSERT INTO tbl_tracking (tx_pagina,tx_paginaOrigen,tx_ipRemota,tx_navegador,dt_fechaVisita) VALUES('$tx_pagina','$tx_paginaOrigen','$i_direccionIp','$tx_navegador',now()) ;" ; $res = mysql_query ( $tx_qryInsert); //Mostrar descripcion del error en caso de //que no se haya insertado el tracking if(!$res){ die(mysql_error()); } <?
Cada linea del script anterior esta comentada por lo que me tomare la libertad de omitir la explicacion. Pero como ves principalmente se realizan dos cosas; recolectar los datos a guardar e insertarlos en la tabla creada para ese proposito.
Si observas en la linea 2 del archivo anterior, estoy insertando un archivo llamado conectar_bd.php con la funcion include de php.
conectar_bd.php
Este archivo se encarga de conectarse con el DBMS y dejar disponible un enlace a la base de datos creada anteriormente.
<?php /* Realiza una conexion al DBMS MySql y selecciona una BD. Author: Gonzalo Silverio gonzasilve@gmail.com Fuente: https://gonzasilve.wordpress.com Archivo: conectar_bd.php */ $conexio; function conectar_bd() { global $conexio; //Definir datos de conexion con el servidor MySQL $elUsr = "root"; $elPw = "12345"; $elServer ="localhost"; $laBd = "prueba"; $conexio = mysql_connect($elServer, $elUsr , $elPw) or die (mysql_error()); mysql_select_db($laBd, $conexio ) or die (mysql_error()); } ?>
Espero que no te sea dificil entender este codigo, pues ya lo he usado y explicado anteriormente en otras entradas del blog.
Paginas con tracking
pagina1.php
He creado 3 paginas de ejemplo a las que se insertara el script que guarda el tracking, solo mostrare el codigo de dos ya que la tercera contiene exactamente el mismo codigo.
<?php /* Pagina 1 de ejemplo de la cual se desea llevar su seguimiento de visitas. Author: Gonzalo Silverio gonzasilve@gmail.com Fuente: https://gonzasilve.wordpress.com Archivo: pagina1.php */ //Insertar el tracking a esta pagina del sitio include "guardaTracking.php"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link REL="SHORTCUT ICON" href="img/tux_icon.ico"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Test Tracking Sitio Web :: Pagina 1</title> <link rel="stylesheet" href="css/estilos.css" type="text/css" /> </head> <body> <h2>Pagina 1 -Test Tracking</h2> <p><a href="index.html">Volver</a></p> <p><a href="tracking_paginas.php">Ver Estadisticas</a></p> </body> </html>
Si observas en la linea 10 es donde se inserta el script del tracking con ayuda de la directiva include de PHP, todo lo demas es HTML y basicamente crea dos enlaces, uno al inicio del sitio web y otro a la tabla de resumen del tracking.
pagina2.php
<?php /* Pagina 2 de ejemplo de la cual se desea llevar su seguimiento de visitas. Author: Gonzalo Silverio gonzasilve@gmail.com Fuente: https://gonzasilve.wordpress.com Archivo: pagina2.php */ //Insertar el tracking a esta pagina del sitio include "guardaTracking.php"; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link REL="SHORTCUT ICON" href="img/tux_icon.ico"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Test Tracking Sitio Web :: Pagina 2</title> <link rel="stylesheet" href="css/estilos.css" type="text/css" /> </head> <body> <h2>Pagina 2 -Test Tracking</h2> <p><a href="index.html">Volver</a></p> <p><a href="tracking_paginas.php">Ver Estadisticas</a></p> </body> </html>
Como decia anteriormente despues de que transcurra el tiempo se iran acumulando datos de todas las paginas trackeadas con los cuales se llevaran las estadisticas del sitio web.
tracking_paginas.php
Esta pagina despliega parte de la informacion del tracking organizada en 3 secciones; informacion del sitio web, de los visitantes y estadisticas de cada pagina web. En este caso e organizado la informacion en base a las paginas web, pero la informacion del tracking se podria analizar, por ejemplo, en base a la fecha de visita.
<?php /* Pagina que muestra la informacion del tracking. Author: Gonzalo Silverio gonzasilve@gmail.com Fuente: https://gonzasilve.wordpress.com Archivo: tracking_paginas.php */ //conectar BD include("conectar_bd.php"); conectar_bd(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <link REL="SHORTCUT ICON" href="img/tux_icon.ico"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Gonzalo Silverio :: Test Tracking Sitio Web</title> <link rel="stylesheet" href="css/estilos.css" type="text/css" /> <style> /*.{ font-size:12px; } */ </style> </head> <body> <table width="100%" border="1" cellspacing="1" bordercolor="#0000FF" id ="tbl_estadisticas"> <thead> <tr> <th colspan="4"><h2>Estadisticas del sitio</h2></th> </tr> <tr> <th width="16%"><strong>Total de Visitantes </strong></th> <th width="24%"><strong>Total de Visitas </strong></th> <th width="25%"><strong>Navegadores usados </strong></th> <th width="35%"><strong>Pagina mas visitada </strong></th> </tr> </thead> <?php $query = "SELECT COUNT( DISTINCT (tx_ipRemota) ) AS i_total FROM tbl_tracking"; $result = mysql_query($query); $i_totalVisitantes = mysql_num_rows($result); $query = "SELECT COUNT(*) as i_total FROM tbl_tracking;"; $result = mysql_query($query); $i_totalVisitas = mysql_result($result,0,'i_total'); $query = "SELECT COUNT(distinct(tx_navegador)) as i_total FROM tbl_tracking"; $result = mysql_query($query); $i_totalNavegadores = mysql_result($result,0,'i_total'); $query = "SELECT tx_pagina, COUNT( tx_pagina ) AS i_total FROM tbl_tracking group by tx_pagina order by i_total DESC;"; $result = mysql_query($query); $i_masVisitada = mysql_result($result,0,'tx_pagina').", ".mysql_result($result,0,'i_total')." visitas"; if($i_totalVisitas>0) { ?> <tr valign="top" > <td><?php echo $i_totalVisitantes; ?></td> <td><?php echo $i_totalVisitas; ?></td> <td><?php echo $i_totalNavegadores; ?></td> <td><?php echo $i_masVisitada; ?></td> </tr> <?php } else { ?> <tr><td colspan="4"><p>No hay datos!</p></td></tr> <?php } ?> </table> <table width="100%" border="1" cellspacing="1" bordercolor="#0000FF" id ="tbl_estadisticas"> <thead> <tr> <th colspan="4"><h2>Estadisticas de visitantes</h2></th> </tr> <tr> <th width="10%"><strong>Direccion Ip</strong></th> <th width="15%"><strong>Fecha</strong></th> <th width="40%"><strong>Navegador usado</strong></th> <th width="35%"><strong>Paginas visitadas</strong></th> </tr> </thead> <?php $queryV = "SELECT * FROM tbl_tracking GROUP by tx_pagina ORDER BY dt_fechaVisita DESC"; $resultV=mysql_query($queryV); $visitors = mysql_num_rows($resultV); if($visitors>0){ $i=1; while ($rowV =mysql_fetch_assoc($resultV)) { $estilo =(($i%2)==0) ? "class='even'":""; ?> <tr valign="top" <?php echo $estilo; ?> > <td><?php echo $rowV['tx_ipRemota']; ?></td> <td><?php echo $rowV['dt_fechaVisita']; ?></td> <td><?php echo $rowV['tx_navegador']; ?></td> <td><a href="<?php echo "http://".$_SERVER['SERVER_NAME'].$rowV['tx_pagina']; ?>" target="_blank"><?php echo $_SERVER['SERVER_NAME'].$rowV['tx_pagina']; ?></a></td> </tr> <?php $i++; } }else{ ?> <tr><td colspan="4"><p>No hay datos!</p></td></tr> <?php } ?> </table> <table width="100%" border="1" cellspacing="1" bordercolor="#0000FF" id ="tbl_estadisticas"> <thead> <tr> <th width="16%" colspan="4"><h2>Estadisticas de paginas</h2></th> </tr> <tr> <th width="16%"><strong>Nombre de la pagina</strong></th> <th width="24%"><strong>Numero de visitas </strong></th> <th width="25%"><strong>Visitado por </strong></th> <th width="35%"><strong>Pagina de donde venia</strong></th> </tr> </thead> <?php $queryP = "SELECT *,count(*) as i_total_visitas FROM tbl_tracking WHERE tx_ipRemota = '".$_SERVER['REMOTE_ADDR']."' GROUP BY tx_pagina"; $resultP=mysql_query($queryP); if($visitors>0){ $i=1; while ($rowP =mysql_fetch_assoc($resultP)) { $estilo =(($i%2)==0) ? "class='even'":""; ?> <tr valign="top" <?php echo $estilo; ?> > <td><?php echo $rowP['tx_pagina']; ?></td> <td><?php echo $rowP['i_total_visitas']; ?></td> <td><?php echo $rowP['tx_ipRemota']; ?></td> <td><a href="<?php echo $rowP['tx_paginaOrigen']; ?>" target="_blank"><?php echo $rowP['tx_paginaOrigen']; ?></a> </td> </tr> <?php $i++; } }else{ ?> <tr><td colspan="4"><p>No hay datos!</p></td></tr> <?php }?> </table> <p align="center"><a href="index.html">Volver</a></p> <br/><br/> </body> </html>
Lo interesante del archivo anterior son las consultas (querys) que se utilizan para obtener los datos, pues hay tantas cosas que se puede hacer con la informacion recolectada. Incluso si asi se necesitara podria utilizarse alguna libreria (como jpGraph) para mostrar la informacion en forma grafica. Pero eso ya depende de las necesidades de cada sitio web. A continuacion muestro un pantallazo de la tabla k muestra el traking del sitio web del ejemplo (click aqui para ampliar):
A continuacion pongo algunos otros querys que obtienen mas informacion estadistica:
//Total de visitas del sitio SELECT count(*) FROM tbl_tracking; //Numero de veces que un navegador a sido usado para visitar el sitio SELECT *, count(*) FROM tbl_tracking GROUP by tx_navegador; //Numero de veces que un usuario en particular nos ha visitado SELECT count(*) FROM tbl_tracking WHERE tx_ipRemota = '127.0.0.1'; //navegador que ha usado un usuario en particular para visitarnos "SELECT *,count(*) FROM tbl_tracking WHERE tx_ipRemota = '127.0.0.1' GROUP BY tx_navegador //Numero de visitas de un usuario en los ultimos 30 dias SELECT *,COUNT(*) FROM tbl_tracking WHERE tx_ipRemota = '127.0.0.1'; //Numero de veces que una pagina ha sido visitada SELECT count(*) FROM tbl_tracking WHERE tx_pagina = '/pagina1.php' //Usuarios que han visitado una pagina en particular SELECT *,count(*) FROM stattracker WHERE tx_pagina = '/pagina1.php' GROUP BY tx_ipRemota
Demo
Hemos llegado al fin del articulo, si deseas ver el ejemplo funcionando da click aqui para ver un demo. Recuerda visitar varias paginas para que veas como se va guardando la informacion, por ultimo entra a la pagina de estadisticas para ver los resultados del tracking.
Si gustas tener los fuentes, ya sabes solo dejame tu email en un comentario y te los hago llegar en un zip. Reviso a diario mi email y por lo tanto, igualmente si tienes dudas con toda confianza me puedes preguntar en un comentario, en cuanto vea tu pregunta la estare contestando.
Espero que te haya gustado el articulo y sobre todo que hojala te sirva de algo en algun momento.
Saludos cordiales.
Hasta pronto y gracias por tu visita.
hola no se programar y me interesa ese scrit, aguien me ayuda. mi correo es raulcatro.123@gmail.com
Best regards. | Sincères salutations. | Saludos.
Enrique Arróniz R.
________________________________
________________________________
Olvida este script es tan antiguo que te sera imposible hacer que funcione si no cambias mas del 50% de las lineas de codigo.
Por otro lado, si depues de tanto tiempo aun sigue con variables que ni se usan o repetidas como $tx_paginaActual y $tx_pagina es un una clara señal de la profesionalidad del autor.
Ademas si eres incapaz de hacerte tu el tuyo, puedes buscar clases ya preparadas mil veces mejores que este sucio codigo.
Hola! Antes que nada gracias por compartir tu conocimiento!
Comento, me funciono perfecto, solo que ahora tengo un inconveniente, todo el código está escrito con «mysql» y la cuestión es que yo tengo escrito todo con «mysqli» y al intentar cambiar lineas a mysqli se me lleno de errores, no se me podrías ayudar con el cambio de syntaxis.
$mysqli = new mysqli(‘Host’, ‘tu_usuario’, ‘tu_contraseña’, ‘labasededatos’);
// ¡Oh, no! Existe un error ‘connect_errno’, fallando así el intento de conexión
if ($mysqli->connect_errno) {
// La conexión falló.
// Probemos esto:
echo «Lo sentimos, este sitio web está experimentando problemas.»;
echo «Error: Fallo al conectarse a MySQL debido a: \n»;
echo «Errno: » . $mysqli->connect_errno . «\n»;
echo «Error: » . $mysqli->connect_error . «\n»;
}
Hola Gonzalo Acabo de ver tu scrript y me parece muy interesante por lo que lo estoy probando y me funciona bien a escepcion de que solo se visualiza un registro en la tabla por lo que me gustaria que se visualizaran mas o incluso paginar las secciones de Estadisticas de visitantes y Estadisticas de paginas si se puede hacer.
Dandote las gracias por adelantado quedo a la espera de tus noticias.
hola gonzalo manda el script comparito, seria ideal para mi que estoy comenzando con php…gracias de antemano, un abrazo!, te dejo mi correo entonces, aguardo respuesta.
hola amigo como estas soy de VENEZUELA y me gusto este ejemplo excelente me podrias enviar el script a mi correo por favor te lo agradeceria mucho aqui esta mi pequeño sitio para los que quieran echarle una visitadita
hola, esta muy bueno el escript, ya lo puse en practica, pero en lugar de poner la ip del usuario he manejado sesiones para introducir el nombre de usuario, que es lo que le interesaba a mi jefe que hiciera, el problema es que en algunas ocasiones estos campos quedan vacíos ( usuario, pagina visitada ) y no encuentro la razón 😦 ojala pudieras ayudarme un poco.
Es buenisimo el script!
Una consulta: si quisiera saber solamente del index.html, por ejemplo yo tengo en mi web un index.php y quisiera trackear los datos de la gente que entra, en si mi web no tiene links a otra pagina, sino todo dentro del index. Se podria adecuar el script para esto? directamente la gente que entra.
Si se puede como seria??
Muchas gracias!!
Hay forma que nos puedas enseñar sobre jpgraph o alguna clase en php para crear gráficas atractivas a partir de los datos generados en el tracking? Muchas gracias por este ejemplo, me ha servido mucho.
Ok, pero por ahora no tengo mucho tiempo tal vez despues.
Saludos.
Muy bueno amigo, muchas gracias. Funcionó 100%
..Por nada, saludos.
hola gonzalo eres un tigre te felicito por el script te envio mi mail para que me envies tu codigo de este script y el de autentocacion con php … gracias
Enviado!,
Saludos
Una pregunta:
i_total , tal como lo manejas en los queries de mysql al momento de recuperar datos, ¿Es un index en la tabla donde vacías los datos?
Aprovecho para felicitarte por el tutorial, yo estoy haciendo ahora algo así para hacer traking en un sitio y me vino muy bien.
i_total es un alias que le doy a un calculo. Por ejmplo, en la linea 42 le doy este alias a la suma de todas las ips distintas que han visitado el sitio web. No es un index.
Saludos
Muy bueno el Tutorial me servio de mucho, no se si me puedes pasar el script a mi correo de ante mano muchas gracias
Ok, ya te lo envie boris.
Saludos
Hola muy bueno el tutorial y me servira de mucha ayuda, no se si podrias pasarme el script, asi que muchas gracias y kisiera poder guardar tambien los valores que se envian ya sean post o get y guardarlos esa parte como se realizaria?
Muy buen aporte, me podrias pasar tu codigo. por fas!
Saludos!!
blankita_0@hotmail.com
Hola he intentado crear la base de datos con este codigo pero no he podido.
/* Crear BD */
CREATE DATABASE prueba;
/* Crear la tabla */
CREATE TABLE `tbl_tracking` (
`id_tracking` int(11) NOT NULL auto_increment,
`tx_pagina` varchar(70) NOT NULL default »,
`tx_paginaOrigen` varchar(200) NOT NULL default »,
`tx_ipRemota` varchar(15) NOT NULL default »,
`tx_navegador` varchar(255) NOT NULL default »,
`dt_fechaVisita` date NOT NULL default ‘0000-00-00’,
PRIMARY KEY (`id_tracking`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
Me sale esto.
Error
consulta SQL:
/* Crear la tabla */ CREATE TABLE `tbl_tracking` (
`id_tracking` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`tx_pagina` VARCHAR( 70 ) NOT NULL DEFAULT »,
`tx_paginaOrigen` VARCHAR( 200 ) NOT NULL DEFAULT »,
`tx_ipRemota` VARCHAR( 15 ) NOT NULL DEFAULT »,
`tx_navegador` VARCHAR( 255 ) NOT NULL DEFAULT »,
`dt_fechaVisita` DATE NOT NULL DEFAULT ‘0000-00-00’,
PRIMARY KEY ( `id_tracking` )
) TYPE = MYISAM AUTO_INCREMENT =1;
MySQL ha dicho:
#1046 – No database selected
Es pósible que me pases el codigo compelto?
Salud y Gracias ante todo por compartir todo tu conocimeinto.
Que tal cyberlion, te esta diciendo que antes de crear la tabla primero debes seleccionar una base de datos para saber donde debe crearse.
Saludos
No he podido crear la base de datos de ninguna manera. ¿podrían revisar el script o explicarme mejor como tengo que hacerlo?
Ok, primero dime que cliente de MySQL estas usando para mandarte pantallas en cuanto tenga tiempo.
Saludos.
Bien amigo e bajado el script (copy-paste) y al parecer el parametro TYPE=MyISAM era el causante del problema por lo que lo e quitado. Espero que ahora ya no tengas ese problema pues yo lo ejecute en Workbench 5.2.47 perfectamente.
Saludos
Hola excelente este script te dejo mi mail por si me lo puedes pasar Gracias.