Como siempre, una feliz idea me hace estudiar … y compartir.
Necesito un contador de visitas para una página (o varias) y los códigos que veo no me gustan o no me sirven.
Lo primero es crear una base de datos y/o una tabla llamada «contador» en el servidor en la que creo los campos:
- id int(6) AUTO_INCREMENT | no hace falta pero siempre lo incluyo.
- dom varchar(10) | para usarla en varios dominios.
- env tinyint(1) | para saber si me ha enviado el dato.
- ip varchar(15) | para almacenar la ip.
- fecha timestamp predeterminado CURRENT_TIMESTAMP
- nav text | para el navegador.
Empezamos el PHPconectando con la base de datos
if(!($conexion = mysql_connect('localhost', 'usuario_base_datos', 'contraseña_base_datos')))
die("Error: No se pudo conectar.");
if(!mysql_select_db('nombre_base_datos', $conexion))
die("Error: No existe la base de datos");
Seguimos con algunas variables que necesitaremos
$dom='miweb';//max. 10 caracteres
$email='webmaster@miweb.es';//sólo necesario como remitente
$ip=VerIp();//ahora vemos la función
$nav=$_SERVER['HTTP_USER_AGENT'];//navegador del visitante
function VerIp(){
if ($_SERVER) {
if($_SERVER["HTTP_X_FORWARDED_FOR"]){
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}elseif ( $_SERVER["HTTP_CLIENT_IP"]){
$realip = $_SERVER["HTTP_CLIENT_IP"];
}else $realip = $_SERVER["REMOTE_ADDR"];
}else{
if(getenv('HTTP_X_FORWARDED_FOR')){
$realip = getenv( 'HTTP_X_FORWARDED_FOR' );
}elseif( getenv( 'HTTP_CLIENT_IP' ) ) {
$realip = getenv( 'HTTP_CLIENT_IP' );
}else $realip = getenv( 'REMOTE_ADDR' );
}
return $realip;
}
Ahora la consulta clave
$q1=mysql_query("SELECT count(*) FROM contador WHERE
dom='$dom'
AND ip='$ip'
AND NOW() <= DATE_ADD(fecha, INTERVAL 3 HOUR)
AND nav='$nav'");
He decidido que 3 horas es un tiempo adecuado para registrar una nueva visita para mi gusto.
Ahora comprobamos si en esas 3 horas ese navegador desde esa ip ha estado y si no es así añadimos un registro en la tabla.
$r1=mysql_fetch_array($q1);
if($r1[0] < 1) mysql_query("INSERT INTO contador (dom,ip,nav) VALUES ('".$dom."', '".$ip."', '".$nav."')");
Lo que necesitábamos, el contador es esto
$q2=mysql_query("SELECT count(*) FROM contador WHERE dom='$dom'");
$r2=mysql_fetch_array($q2);
$visitas = $r2[0];
y lo insertaremos en el archivo que queramos con
<?php echo 'Visitas: '.$visitas; ?>
Ahora yo he decidido que cuando llegue la visita 300 me mande un correo electrónico y actualizo el valor "env" a "1" para saber que ya me lo ha enviado.
if(intval($visitas)%300==0){
$q3=mysql_query("SELECT count(*) FROM contador WHERE
dom='$dom' AND env='0' ORDER BY fecha ASC,ip ASC,nav ASC");
$r3=mysql_fetch_array($q3);
if($r3[0] > 0){
$mensaje = '
<html>
<head>
<title>300 visitas nuevas de '.$dom.'</title>
</head>
<body>
<p>300 visitas nuevas de '.$dom.'</p>
<table>
<tr>
<th>Fecha</th><th>IP</th><th>Navegador</th>
</tr>';
$q4=mysql_query("SELECT fecha,ip,nav FROM contador WHERE
dom='$dom' AND env='0' ORDER BY fecha ASC,ip ASC,nav ASC");
while($r4=mysql_fetch_array($q4)){
$mensaje.= '
<tr><td>'.$r4['fecha'].'</td>
<td>'.$r4['ip'].'</td>
<td>'.$r4['nav'].'</td></tr>';
}
$mensaje.= '
</table>
</body>
</html>';
$cabeceras = 'MIME-Version: 1.0' . "\r\n";
$cabeceras .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$cabeceras .= 'From: '.$dom.' <'.$email.'>' . "\r\n";
mail ( 'miemail@gmail.com' , '300 visitas nuevas en '.$dom , $mensaje , $cabeceras );
mysql_query("UPDATE contador SET env='1' WHERE dom='$dom' AND env='0'");
}
}
Etiquetas: Código, Contador, mysql, php