Aunque en estos momentos existen diferentes sistemas para averiguar cuantos visitantes y visitas tiene un sitio web, no está de más tener en cuenta la propuesta que hacemos a continuación. Explicamos el proceso o procesos que hay que seguir para instalar un contador de visitas en un sitio web que soporte PHP como lenguaje programación y MySQL como gestor de base datos.
Lo que proponemos a continuación es válido para cualquier sitio web gestionado o no con WordPress. Habrá que elaborar algunos archivos y subirlos al servidor en el que están alojado el sitio. Consideramos que cualquier gestor puede llevar a buen fin nuestra propuesta.
Scripts en PHP
A continuación vamos a mostrar los códigos de los dos scripts en PHP que gestionan el contador. El primero se ocupa de recoger los datos de acceso a la base de datos que contiene las tres tablas que sirven para almacenar la información necesaria para el perfecto funcionamiento del contador. El segundo recoge los accesos de los visitantes y las páginas vistas y guarda todo en la base de datos.
Acceso a la base de datos
Llamaremos inc_counter.php al archivo que contiene toda la información necesaria para acceder a la base de datos que alberga las tres tablas necesarias para el funcionamiento del contador. Podemos crear una carpeta o directorio llamado contador en el que incluiremos este archivo:
<?php
$server = 'nombre_servidor';
$user = 'nombre_usuario';
$pass = 'contraseña_usuario';
$db2 = 'nombre_base_datos';
?>
Archivo destinado a recabar datos
<?php
/** Inclusión del archivo de acceso a la base de datos **/
include ("inc_counter.php");
/** Detección de robots. Devuelve el nombre del robot o, si no lo es, devuelve false **/
function crawlerDetect($USER_AGENT) {
$crawlers = array(
array('Google', 'Google'),
array('msnbot', 'MSN'),
array('Rambler', 'Rambler'),
array('Yahoo', 'Yahoo'),
array('AbachoBOT', 'AbachoBOT'),
array('accoona', 'Accoona'),
array('AcoiRobot', 'AcoiRobot'),
array('ASPSeek', 'ASPSeek'),
array('CrocCrawler', 'CrocCrawler'),
array('Dumbot', 'Dumbot'),
array('FAST-WebCrawler', 'FAST-WebCrawler'),
array('GeonaBot', 'GeonaBot'),
array('Gigabot', 'Gigabot'),
array('Lycos', 'Lycos spider'),
array('MSRBOT', 'MSRBOT'),
array('Scooter', 'Altavista robot'),
array('AltaVista', 'Altavista robot'),
array('IDBot', 'ID-Search Bot'),
array('eStyle', 'eStyle Bot'),
array('Scrubby', 'Scrubby robot')
);
foreach ($crawlers as $c) {
if (stristr($USER_AGENT, $c[0])) {
return($c[1]);
}
}
return false;
}
/** Acceso a la base de datos **/
$db = mysqli_connect("$server", "$user", "$pass") or die("No hay conexión.");
if(!$db)
die("no db");
if(!mysqli_select_db("$db2",$db))
die("No se seleccionó la base de datos.");
/** Lectura y detección de fecha y hora así como de la IP del visitante **/
$server_time=date("U");
$client_ip=$_SERVER['REMOTE_ADDR'];
$arr = getdate();
$dia_actual = $arr["mday"];
$hora_actual = $arr["hours"];
$minuto_actual = $arr["minutes"];
$crawler = crawlerDetect($_SERVER['HTTP_USER_AGENT']);
$visitorType = '';
if ($crawler){
$visitorType = 'bot';
}
/** Lectura y actualización de datos en la tabla visitas **/
$visita = mysqli_query("SELECT * FROM visitas");
while($row = mysqli_fetch_array($visita)) {
extract($row);
$dia = $row["dia"];
$totales = $row["totales"];
$hoy = $row["hoy"];
$vistotales = $row["vistotales"];
$vishoy = $row["vishoy"];
if ($dia_actual != $dia) {
$hoy = 1;
$vishoy = 1;
}else{
$hoy++;
}
$totales++;
}
if ($visitorType =='') {
$actualiza="UPDATE visitas SET dia='$dia_actual', totales='$totales', hoy='$hoy', vishoy='$vishoy'";
mysqli_query($actualiza);
}
/** Lectura y actualización de datos en la tabla current_users (usuarios online) **/
$p4 = mysqli_query("SELECT * FROM current_users WHERE ip='$client_ip'");
$pa4 = mysqli_fetch_array($p4);
if($pa4) {
$update="UPDATE current_users set time='$server_time' where ip='$pa4[ip]'";
mysqli_query($update) or die("No es posible actualizar: " . mysqli_error());
} else {
$query=("INSERT INTO `current_users` (`ip`, `time`, `visitorType`) VALUES ('$client_ip', '$server_time', '$visitorType')");
$result = mysqli_query($query) or die("No se puede insertar: " . mysqli_error());
$vishoy++;
$vistotales++;
if ($visitorType =='') {
$actualiza1="UPDATE visitas SET vistotales='$vistotales', vishoy='$vishoy'";
mysqli_query($actualiza1);
}
}
$queryA = mysqli_query("SELECT ip FROM current_users WHERE visitorType = 'bot'");
$num_bot = mysqli_num_rows($queryA);
$result6 = mysqli_query("SELECT ip FROM current_users" );
$current_visitors = mysqli_num_rows($result6);
$num_no_bot = $current_visitors - $num_bot;
/** Lectura y actualización de la tabla max_users (máximo número de usuarios) **/
$max_user = mysqli_query("SELECT * FROM max_users");
while($row = mysqli_fetch_array($max_user)) {
extract($row);
$total = $row["total"];
if ($total < $num_no_bot) {
$total = $num_no_bot;
$actualiza2="UPDATE max_users SET total='$total', hora='$server_time'";
mysqli_query($actualiza2);
}
}
/** Gestión del tiempo que controla la vigencia de los usuarios online. Por defecto 3 minutos **/
$time2=$server_time-180;
$remove="DELETE from current_users WHERE time<'$time2'";
mysqli_query($remove) or die("No se puede borrar: " . mysqli_error());
?>
El archivo anterior, al que llamaremos counter.php, lo colocamos también en la carpeta contador. En dicho archivo se explican con diferentes etiquetas las sucesivas secciones del mismo.
Tablas y scripts de seguimiento
Vamos a explicar a continuación como se pueden crear las tablas en la base de datos. Para ello necesitas acceder a tu gestor y, en el recuadro de inserción de código (SQL), pegar lo que tienes a continuación y pulsar sobre el botón Continuar.
--
--
-- Estructura de tabla para la tabla `current_users`
--
CREATE TABLE `current_users` (
`ip` varchar(30) NOT NULL DEFAULT '',
`time` varchar(30) NOT NULL DEFAULT '',
`visitorType` varchar(200) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `current_users`
--
INSERT INTO `current_users` (`ip`, `time`, `visitorType`) VALUES
('', '', '');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `max_users`
--
CREATE TABLE `max_users` (
`total` varchar(30) NOT NULL DEFAULT '',
`hora` varchar(30) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `max_users`
--
INSERT INTO `max_users` (`total`, `hora`) VALUES
('', '');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `visitas`
--
CREATE TABLE `visitas` (
`dia` int(2) DEFAULT NULL,
`totales` int(7) DEFAULT NULL,
`hoy` int(5) DEFAULT NULL,
`vistotales` int(7) DEFAULT NULL,
`vishoy` int(5) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `visitas`
--
INSERT INTO `visitas` (`dia`, `totales`, `hoy`, `vistotales`, `vishoy`) VALUES
('', '', '', '', '');
--
-- Índices para tablas volcadas
--
--
-- Indices de la tabla `current_users`
--
ALTER TABLE `current_users`
ADD PRIMARY KEY (`ip`),
ADD KEY `ip` (`ip`),
ADD KEY `ip_2` (`ip`),
ADD KEY `ip_3` (`ip`),
ADD KEY `ip_4` (`ip`);
--
-- Indices de la tabla `max_users`
--
ALTER TABLE `max_users`
ADD PRIMARY KEY (`total`);
--
-- Indices de la tabla `visitas`
--
ALTER TABLE `visitas`
ADD PRIMARY KEY (`dia`);
Como podrás observar hay tres tablas:
- current_users: Almacena la IP, la fecha (con hora incluida) y el tipo de visitante (bot o humano) en cada de los campos ‘ip’, ‘time’ y ‘visitorType’.
- max_users: Almacena en dos campos el número máximo de visitantes online registrados en el sitio (‘total’) y la fecha y hora del registro (‘hora’).
- visitas: Va acumulando toda la información recabada. Así ‘dia’ registra el día actual. Cuando se produce un cambio, el paso al día siguiente, los campos ‘hoy’ y ‘vishoy’ se ponen a cero. Los campos ‘totales’ y ‘vistotales’ registran el total de páginas vistas desde que se inició el contador y el total de visitantes, respectivamente. Los campos ‘hoy’ y ‘vishoy’ hacen lo mismo que los anteriores pero para cada día.
Código de rastreo
Para recabar todos los datos anteriores e insertarlos en las tablas anteriores es necesario incluir el código que te mostramos a continuación. Si utilizas WordPress sólo tienes que incluirlo en el archivo footer.php de tu tema, justo antes de la etiqueta </body>.
Integrar visor de resultados
Ya hemos mostrado el código que necesitas para gestionar el contador, te hemos explicado como crear las tablas que lo gestionan y hemos puesto el código que debes insertar en las páginas de tu sitio para recabar datos. Ahora le corresponde le turno a la integración de los resultados. A continuación te mostramos el código que debes incluir en la página que los mostrará.
<?php
/** Función para fijar la fecha y hora de la zona en la que reside tu servidor **/
date_default_timezone_set('Europe/Madrid');
/** Función para mostrar las fecha en castellano **/
function actual_date ()
{
$week_days = array ("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado");
$months = array ("", "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
$year_now = date ("Y");
$month_now = date ("n");
$day_now = date ("j");
$week_day_now = date ("w");
$date = $week_days[$week_day_now] . ", " . $day_now . " de " . $months[$month_now] . " de " . $year_now;
return $date;
}
/** Función que muestra las horas y minutos **/
$arr = getdate();
$hora_actual = $arr["hours"];
$minuto_actual = $arr["minutes"];
/** Inclusión del archivo que alberga el acceso a la base de datos **/
@include(getenv('DOCUMENT_ROOT').'/contador/inc_counter.php');
/** Llamada a la base de datos **/
$db = mysqli_pconnect("$server", "$user", "$pass") or die("No hay conexión.");
if(!$db)
die("no db");
if(!mysqli_select_db("$db2",$db))
die("No se seleccionó la base de datos.");
/** Lectura de los datos de la tabla 'visitas' **/
$visita = mysqli_query("SELECT * FROM visitas");
while($row = mysqli_fetch_array($visita)) {
extract($row);
$dia = $row["dia"];
$totales = $row["totales"];
$hoy = $row["hoy"];
$vistotales = $row["vistotales"];
$vishoy = $row["vishoy"];
}
/** Lectura de los datos de la tabla 'current_users' **/
$queryA = mysqli_query("SELECT ip FROM current_users WHERE visitorType = 'bot'");
$num_bot = mysqli_num_rows($queryA);
$result6 = mysqli_query("SELECT ip FROM current_users" );
$current_visitors = mysqli_num_rows($result6);
$num_no_bot = $current_visitors - $num_bot;
/** Lectura del máximo número de usuarios y la hora **/
$queryB = mysqli_query("SELECT * FROM max_users");
while($row = mysqli_fetch_array($queryB)) {
extract($row);
$total = $row["total"];
$hora = $row["hora"];
}
/** Se muestran todos los datos recabados en la página **/
echo "<strong>Fecha y hora:</strong> ";
echo actual_date();
echo "<strong>";
echo date(" H:i:s", time());
echo "</strong><br /><br />";
echo "<strong>Páginas vistas desde 1/01/2010 (sólo humanos):</strong> <span style='color: #FF0000;'>$totales</span><br />";
echo "<strong>Páginas vistas Hoy (sólo humanos):</strong> <span style='color: #0000CC;'>$hoy</span><br />";
$pageshora = round($hoy/($hora_actual+$minuto_actual/60));
echo "<strong>Páginas vistas Hoy por hora (sólo humanos):</strong> <span style='color: #006600;'>$pageshora</span><br /><br />";
echo "<strong>Visitantes desde 1/01/2010 (sólo humanos):</strong> <span style='color: #FF0000;'>$vistotales</span><br />";
echo "<strong>Visitantes Hoy (sólo humanos):</strong> <span style='color: #0000CC;'>$vishoy</span><br />";
$visitshora = round($vishoy/($hora_actual+$minuto_actual/60));
echo "<strong>Visitantes Hoy por hora (sólo humanos):</strong> <span style='color: #006600;'>$visitshora</span><br />";
echo "-------------------------------------------------------------------<br />";
echo "<strong>Visitantes Online:</strong> <span style='color: #FF0000;'>$current_visitors</span><br />";
echo "<strong>-- Bots:</strong> <span style='color: #0000CC;'>$num_bot</span><br />";
echo "<strong>-- Humanos:</strong> <span style='color: #006600;'>$num_no_bot</span><br /><br />";
echo "<strong>Máximo número de Visitantes Online (humanos):</strong> <span style='color: #800000;'>$total</span> el <strong>";
echo date("d-m-Y", $hora);
echo "</strong> a las <strong>";
echo date(" H:i:s", $hora);
echo "</strong>";
?>
Si utilizas WordPress y quieres crear una página que muestre los resultados, debes instalar antes un plugin que permita la inserción de código PHP en la misma. Si tienes dudas sobre que plugin instalar, puedes decantarte por WPCode o Insert PHP Code Snippet.