Foros del Web » Programando para Internet » PHP »

Contador discriminando por ip utilizando mysql y php

Estas en el tema de Contador discriminando por ip utilizando mysql y php en el foro de PHP en Foros del Web. (PHP Y MYSQL ) CONTADOR DE VISITAS POR IP SIN COOKIES CON POSIBILIDAD DE ESTADISTICAS. Evidence [email protected] Lo que voy a explicar a continuación es ...
  #1 (permalink)  
Antiguo 02/04/2004, 08:10
 
Fecha de Ingreso: marzo-2004
Mensajes: 4
Antigüedad: 20 años
Puntos: 0
Contador discriminando por ip utilizando mysql y php

(PHP Y MYSQL ) CONTADOR DE VISITAS POR IP SIN COOKIES CON POSIBILIDAD DE ESTADISTICAS.

Evidence [email protected]

Lo que voy a explicar a continuación es para crear un contador de visitas que verifica la ip del usuario y verifica en la base de datos si en la última hora hubo alguna entrada con la misma ip, así discriminar o aceptar la cuenta de la visita.
No voy a explicar como se crea una base de datos ni nada relacionado si tienes alguna duda al respecto deberás leerte algún manual al respecto.

En primer lugar debemos de tener una base de datos en la cual introducir la tabla siguiente.

Código PHP:
CREATE TABLE `contador` (
  `
idint(11NOT NULL auto_increment,
  `
ipvarchar(15) default NULL,
  `
horavarchar(8) default NULL,
  `
fechavarchar(20) default NULL,
  `
horauvarchar(10) default NULL,
  `
diauchar(3) default NULL,
  `
aniouvarchar(4) default NULL,
  
KEY `id` (`id`)
TYPE=MyISAM AUTO_INCREMENT=8


La tabla bien puedes crearla trabes de phpmyadmin o importando el sql o en fin como te de la gana.
Una vez creada la tabla vamos al php, primero el código y luego vamos desglosando, si os parece.

Configuración.php
Código PHP:
<?php
$bd_host 
"localhost";
$bd_usuario "user";
$bd_password "contraseña";
$bd_base "base_de_datos";
$con mysql_connect($bd_host$bd_usuario$bd_password);
mysql_select_db($bd_base$con);
?>
En este fichero vamos a crear el acceso a la base de datos y asignarla a una variable para después no estar repitiendo el código.
Donde localhost va el host donde esta hospedada la base de datos, si estas trabajando el php en el mismo servidor que la bdd entonces debes dejarlo como localhost, en el caso contrario deberías poner el host adecuado.
Donde user el usuario, contraseña se entiende u base de datos el nombre de la base de datos.
Después asignamos a la variable $con todos los datos para conectar y asignamos la base de datos.
Ahora vamos a lo que es en si el script, igual que antes primero el código y luego desglosamos.

Countbdd.php
Código PHP:
<?
require('configuracion.php');
//se requiere el archivo para validar los datos de usuario de bdd para conectar
$ip $REMOTE_ADDR;
$fecha date("j \d\e\l n \d\e Y");
$hora date("h:i:s");
$horau date("h");
$diau date("z");
$aniou date("Y");
//se asignan la variables
$sql "SELECT aniou, diau, horau, ip ";
$sql.= "FROM contador WHERE aniou LIKE '$aniou' AND diau LIKE '$diau' AND horau LIKE '$horau' AND ip LIKE '$ip' ";
$es mysql_query($sql$con) or die("Error al leer base de datos: ".mysql_error);
//se buscan los registros que coincidan con la hora,dia,año e ip 
if(mysql_num_rows($es)>0)
{
//no se cuenta la visita
}
else
{
$sql "INSERT INTO contador (id, ip, fecha, hora, horau, diau, aniou) ";
$sql.= "VALUES ('','$ip','$fecha','$hora','$horau','$diau','$aniou')";
$es mysql_query($sql$con) or die("Error al grabar un mensaje: ".mysql_error);
}
//creamos el condicionamiendo para logearlo o no.
$sql "SELECT * ";
$sql.= "FROM contador WHERE id ";
$es mysql_query($sql$con) or die("Error al leer base de datos: ".mysql_error);
$visitas mysql_num_rows($es);
$men=$men "<table width='9%' border='1' height='25' bgcolor='#333333'>" chr(10);
$men=$men "<tr>" chr(10);
$men=$men "<td><font color=#FFFFFF>Visitas:$visitas</font></td>" chr(10);
$men=$men "</tr>" chr(10);
$men=$men "</table>" chr(10);
?>
Primero requerimos el archivo configuración.php para tener la variable $con preparada para conectar.
require('configuracion.php');

Ahora vamos asignar las variables:
Código PHP:
$ip $REMOTE_ADDR
Asignamos la ip

Código PHP:
$fecha date("j \d\e\l n \d\e Y"); 
Asignamos la fecha en formato: 1 del 4 de 2004
Código PHP:
$hora date("h:i:s"); 
Asignamos la hora en formato: hh:mm:ss


Código PHP:
$horau date("h"); 
Asignamos otra hora en formato de 2 dígitos de 0 a 23, ahora os explicaré el por que almaceno dos datos de hora y dos de fecha.

Código PHP:
$diau date("z"); 
Asignamos el número de dia del año de 1 a 366.

Código PHP:
$aniou date("Y"); 
Asignamos el año en formato de 4 dígitos: 2004

Os preguntareis por que he guardado distintos formatos de fecha y hora.
Pues simplemente he guardado unos $horau,$diau,$aniou para cercar la búsqueda en la base de datos y $fecha,$hora por si queremos hacer una visualización de los registros en unas estadísticas, seguimos con el código.


Código PHP:
$sql "SELECT aniou, diau, horau, ip ";
$sql.= "FROM contador WHERE aniou LIKE '$aniou' AND diau LIKE '$diau' AND horau LIKE '$horau' AND ip LIKE '$ip' ";
   
$es mysql_query($sql$con) or die("Error al leer base de datos: ".mysql_error); 
Ahora leemos la base de datos y comparamos que en la fecha actual a la hora actual ,seha efectuado o no alguna entrada con la misma ip del usuario.
Y le decimos que nos avise de si se ocasiona un error en la lectura.



Código PHP:
if(mysql_num_rows($es)>0)
{
//no se cuenta la visita

Una vez leída la base de datos según nuestros criterios de búsqueda, creamos la condición de que si el numero de registros hallados es mayor que 0 no se cuenta la visita puesto que quiere decir que hace menos de una hora esa ip conecto.

Código PHP:
else
{
$sql "INSERT INTO contador (id, ip, fecha, hora, horau, diau, aniou) ";
$sql.= "VALUES ('','$ip','$fecha','$hora','$horau','$diau','$aniou')";
$es mysql_query($sql$con) or die("Error al grabar un mensaje: ".mysql_error);


En el caso contrario añadimos el registro de dicha ip a la base de datos.


Código PHP:
$sql "SELECT * ";
$sql.= "FROM contador WHERE id ";
$es mysql_query($sql$con) or die("Error al leer base de datos: ".mysql_error);
$visitas mysql_num_rows($es); 
Ahora leemos la base de datos de nuevo sin criterios de búsqueda y contamos los registros, para saber la cantidad total de visitas y le asignamos el valor a la variable $visitas.

Código PHP:
$men=$men "<table width='9%' border='1' height='25' bgcolor='#333333'>" chr(10);
$men=$men "<tr>" chr(10);
$men=$men "<td><font color=#FFFFFF>Visitas:$visitas</font></td>" chr(10);
$men=$men "</tr>" chr(10);
$men=$men "</table>" chr(10); 
Creamos una pequeña tabla para mostrar las visitas totales.



Código PHP:
<?
require('countbdd.php');
echo 
$men;
?>
Después metemos este código en un phtml y listo.

Bueno si quieres estadísticas ya sabes………..
Este script no esta echo para lo que es a propósito de utilizarlo, si no para que aquellos que les surja la duda que me surgió a mi en aquel momento tengan donde referirse.
Espero os haya sido de utilidad.
  #2 (permalink)  
Antiguo 02/04/2004, 08:14
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Un par de detalles: no funciona con register_globals a off; y REMOTE_ADDR devuelve la IP del proxy si se conecta a traves de uno, asi que todos los usuarios de un proxy seran identificados como uno solo.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 02/04/2004, 10:04
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 22 años, 8 meses
Puntos: 9
algunas funciones en vez de usar consultas repetidas, tambien de usar mejor el TIMESTAMP en vez de varios renglones de hora, dia, mes y año. Es mas detallado y mas ahorrador.

salu2
  #4 (permalink)  
Antiguo 20/02/2005, 09:00
mon
 
Fecha de Ingreso: febrero-2003
Mensajes: 506
Antigüedad: 21 años, 2 meses
Puntos: 0
Y que pasaría si el cliente visita la página por primera vez a las 10:59 y a las 11:05 vulve al mismo sitio, sería mucha casualidad que todos se registraran a las horas en punto para que pase una hora y queden otra vez registrados, no? cómo se puede solucionar esto?, gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 06:18.