Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras páginas, para ello utilizamos herramientas muy útiles como contadores de visitas, analizadores de tráfico, etc.
Por otro lado, uno puede programar su propio sistema de análisis de tráfico haciendo un extracto de todas las variables de entorno que contienen esta información. Dependiendo del servidor Web (Apache, IIS, etc.)
Hace mucho tiempo encontré una base de datos (actualizada periódicamente) que contiene todos los números de IP que se pueden encontrar en la red. Estos están almacenados en forma de rangos y también indican el País o la ubicación geográfica de cada rango. Con esta información es fácil determinar el país de procedencia del visitante simplemente con saber su número de IP.
La dirección donde pueden descargar esa base de datos es:
http://ip-to-country.webhosting.info/node/view/6
Dichos datos están delimitados por comas (CSV) con el fin de ser actualizados rápidamente a cualquier gestor de datos que lo permita. Incluyendo a MySQL por su puesto.
Importando el archivo csv en MySQL
El archivo que contiene la base de datos de IP tiene esta estructura:
"0033996344","0033996351","GB","GBR","UNITED KINGDOM" "0050331648","0083886079","US","USA","UNITED STATES" "0094585424","0094585439","SE","SWE","SWEDEN" ...
Paso 1: Crear la tabla ipdatabase (u otra que deseen) con la siguiente estructura:
CREATE TABLE ipdatabase ( ip_from int(10) unsigned, ip_to int(10) unsigned, country_code2 char(2), country_code3 char(3), country_name varchar(50), KEY ip_from (ip_from), KEY ip_to (ip_to) );
Paso 2: Importar los datos con LOAD DATA:
LOAD DATA LOCAL INFILE 'ip-to-country.csv' INTO TABLE test_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
Paso 3. Finalmente escribir el codigo para detectar el pais:
<?$link = mysql_connect(“localhost” , [...] , [...]);mysql_select_db(“ipdatabase”,$link);
$sql = “SELECT country_code2,country_name FROM ipdatabase “. “WHERE IP_FROM<=inet_aton(’$REMOTE_ADDR’) “. “AND IP_TO>=inet_aton(’$REMOTE_ADDR’) “;
if( $res = mysql_query($sql,$link)){ $row =mysql_fetch_row($res); echo “<br>Numero de IP: <b>$REMOTE_ADDR:</b><br>”; echo “Pais : “.$row[0].” - “.$row[1]; echo “<img src=/images/flags/”; echo strtolower($row[0]).“.gif width=18 height=12>”; mysql_free_result($res);}else{ echo mysql_error($link);}mysql_close($link);?>
He estado haciendo pruebas con esta base, pueden ver el script PHP en acción en esta dirección:
http://www.latindevelopers.com/country.php .
Este script lo integraré a Latindevelopers.com en las proximas semanas.
Update:
Habia olvidado poner el codigo fuente del archivo country.php:




28 comments ↓
Esta muy bueno el script en su demostracion a pesar de que no muestra la bandera del pais siendo que tiene dicha opsion.
En cuanto al script te comentare que soy nuevo en php y todavia no he hecho ninguna funcionalidad con base de datos, asi que te agradeceria si me explicaras como llenar una base de datos, como volcar el archivo exel que muestras en el link para ponerlo en la base de datos, desde ya muchas gracias.
Elias
Hola Master:
Muy buena la info, estoy probando este ejemplo, mucha buena suerte.
Saludos totales.
Hola, me parece excelente que compartas esta información y tu código, nadamas tengo un a preguntita… veo q aparece la banderita del pais, de donde se sacan esas las descargas una por una o como? en el archivo q bajé solo viene el csv pero como puedo obtener todas las banderas???
gracias!
bueno ya las encontre, estan disponibles en esta dirección:
http://ip-to-country.webhosting.info/node/view/91
Está excelente este script que ya he visto en varios sites y me imáginaba que era como el que tienes aqui publicado, pero necesitaba la BD del enlace, en algunos sites he visto que hay incluso las ciudades no tendrás idea de como las obtienen, será que hay otra BD por ahi más especifica?…
Bueno seguire buscando a ver…
Llevo días intentando descifras diferentes códigos y el tuyo es realmente fácil y asequible. Gracias por tu ayuda.
Aprovecho para solicitarte me indiques si conoces algún código php para averiguar la hora del sistema local del visitante de mi página, de forma que pueda calcular la diferencia horaria entre su máquina y mi servidor.
Gracias de nuevo.
fangosto,
La hora del cliente puedes obtenerla con JavaScript, ya que PHP se ejecuta en el servidor y JavaScript en el cliente.
Latin, lo que me comentas ya lo sabía. Necesitaba el código para, desde mi Servidor, averiguar la hora del PC/Cliente y así conocer la diferencia horaria entre ellos.
Al final no encontré la solución y me lo tuve que diseñar yo. Si alguien está interesado tendrá que visitar mi página e ir a LasUtilidades/UsoHoraCliente.php.
Os pondría el código aquí, pero no sé copiar código y pegarlo formateado. De paso si me lo indicáis os lo agradecerá.
Un abrazo.
pero cuales son los nombres de las columans del cvs ? para poder importarlo con Load Data en mysql
Quisiera saber una forma sencilla de saber el IP y luego a que PC corresponde de los mails recibidos, porque recibo mucha basura.
Gracias
Hey buen codigo… creo que esta muy bien.. solo que tengo una duda… como lleno la tablas con los datos de la bandera y su ip correspondiente con el nombre del pais… sabran una fuente para sacar eso..
Saludos y se le agradece
como volcar el archivo exel que muestras en el link para ponerlo en la base de datos, desde ya muchas gracias.
Ya he actualizado el post para que puedan leerlo.
Gracias por las sugerencias.
Saludos.
Ok, Gracias!!!
tengo un pequeño problema, cuando importo en BD con LOAD DATA me sale error y no se importa….
Me ayudan???
Gracias.
Saludos!!!
Excelente, … Gracias
logro hacer el paso 1, pero despues en el 2º paso me da siempre “error” … y al parecer a “web” le pasa/le sale el mismo error que a mi en el paso 2…
concretamente me da este error:
#2 - File ‘ip-to-country.csv’ not found (Errcode: 2)
para mi que esto ya ha dejado de funcionar porque, me he pateado el culo buscando formas de hacerlo de otras maneras y no hay formas:
si pongo LOAD DATA LOCAL INFILE, me sale que no encuentra el archivo (el error que puse mas arriba)
si cambio los de “test_table” por el nombre de la tabla “iptocountry” sigue sin encontrar el archivo
si pongo el en vez de LOAD DATA LOCAL INFILE ‘ip-to-country’ y pongo el path UNIX del servidor donde tengo alojado el archivo CSV, tampoco lo encuentra y me da el mismo error (el path es algo asi como /home/USERNAME/public_html/ip-to-country.csv)
si cambio LOAD DATA LOCAL INFILE por LOAD DATA INFILE, me dice que ” USERNAME@Localhost no tiene permiso…
he hechado ya más 6 horas pa esto, y no logro ninguna solución, no soluciono lo del paso número 2… Estoy por coger un ODIO TREMENDO a esto del diseño web o programación y declararme a favor de que esto del diseño es para menter priviliguiadas porque vamos… el dolor de cabeza que estoy pillando es de cagarse y no doy a basto para tantas aspirinas (-*_*-) … (por cierto, tengo que confesar que nunca en mi vida he dado ninguna clase o enseñanza relacionada con ordenadores, y eso que tengo 20 años… ya es raro, pero vamos me han contado que esto de diseño y tal era facil y ya veo que es lo mas complicado del mundo…. me es mas facil hacer un plan Financiero-producción-marketing que esto de diseño la verdad)
aqui un novato en Extremis.apuros ^^
ok, ya está todo solucionado… he tenido que hacer las siguientes cosas:
1º bajarme el archivo ip-to-country.csv
2º subirlo a mi servidor host (pero SIN colocarlo en ninguna subcarpeta
3º cambiar permisos a 777 (ò 0777 si uso el FireFTP)
4º cambiarle el nombre al archivo por uno más corto y sin guiones (le cambie el nombre de “ip-to-country.csv” a “ip.csv”)
5ºusar el siguiente comando un vez creado la carpeta:
LOAD DATA LOCAL INFILE ‘/home/USERNAME/ip.csv’
INTO TABLE iptocountry
FIELDS TERMINATED BY ‘,’
LINES TERMINATED BY ‘\r\n’;
*notas*:
- donde pone “… INFILE ‘/home/USERNAME/ip.csv’…”,
se deberia poner la ruta UNIX de cada uno.. eso se pregunta al dueño del servicio de hosting claro.
- donde pone “… TABLE iptocountry …”, he cambiado lo de test_table por iptocountry (vamos por el nombre de la tabla sino, no sale)
saludos! ^^
Gracias. Muy util. Buen estilo¡¡¡
necesito ayuda:
¿os sale algo en mi direccion de iptocountry, http://www.zen4rox.cheaphostdirect.com/ip.php ?
es que no se donde esta el fallo, pero yo no veo nada… y no se si el fallo está aqui en el codigo php:
=inet_aton(’$REMOTE_ADDR’)”;
if( $res = mysql_query($sql,$link))
{
$row =mysql_fetch_row($res);
echo “Dirección IP: $REMOTE_ADDR:“;
echo “País : “.$row[0].” - “.$row[1];
echo “”;
mysql_free_result($res);
}
else
{
echo mysql_error($link);
}
mysql_close($link);
?>
despues de el tiempo que le exé para hacer la tabla en SQL y poder subir los datos del archivo ip-to-country.csv… ahora esto no función… (me va a dar una depresión con todo esto
)
perdon.. pero no se porque, pero el codigo PHP que acabo de poner arriba a salido imcompleto. es este:
=inet_aton(’$REMOTE_ADDR’)”;
if( $res = mysql_query($sql,$link))
{
$row =mysql_fetch_row($res);
echo “Dirección IP: $REMOTE_ADDR:“;
echo “País : “.$row[0].” - “.$row[1];
echo “”;
mysql_free_result($res);
}
else
{
echo mysql_error($link);
}
mysql_close($link);
?>
joe, sale cortado…
Hola, me parece muy bueno, me costo lograr subir tanto peso del archivo .csv, pero ya esta en la BD, tengo un problema eh puesto mi IP como default pero me da como pais ESTADOS UNIDOS, alguien me puede pasar el archivo exportado de esa tabla en *.sql para montarlo por si es error en la subidad por partes que eh hecho.
Gracias
Hola, me parece muy bueno, me costo lograr subir tanto peso del archivo .csv, pero ya esta en la BD, tengo un problema eh puesto mi IP como default pero me da como pais ESTADOS UNIDOS, alguien me puede pasar el archivo exportado de esa tabla en *.sql para montarlo por si es error en la subidad por partes que eh hecho.
Gracias
Hola prueben el link de mi web, no me bien los paises.
Probe el script y yo estoy en venezuela y me dice que estoy en Colombia !!!
Leave a Comment