debug_mode=ON

Buscar en

 
 

Geolocalizacion en tu propia base de datos (MySQL)

Escrito por Albertux hace 1 años bajo una licencia de Creative Commons Creative Commons License
1691 visitas. Etiquetas: geolocalizacion, php, mysql

Aqui el script de instalación de la base de datos:

#!/bin/bash
# Script: geoip.sh
# Author: Alberto Isaac Ayala Esquivias
# E-mail: <albertoi7@gmail.com>
# Web: http://albertux.ayalasoft.com 
clear
echo "=====================================-"
echo " GeoIp MySQL Database Easy Installer. "
echo "======================================"
echo ""
echo "Script Created By http://AyalaSoft.com ";
echo ""
stty -echo 
read -p "MySQL root password: " mysql_pass; echo
stty echo
echo -n "Do you want to create database of MySQL (y/n): "
read op
if [ "$op" = "y" ]; then
echo -n "Create new database, name: "
    read database
    mysqladmin -u root --password=$mysql_pass create $database
else
echo -n "Which database do you want to use to insert 'geoip' table: "
read database
fi
echo -e "\nDownload  [ GeoIPCountryCSV.zip ]"
wget -c "http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip"
echo -e "\nUnZip [ GeoIPCountryCSV.zip ]"
unzip GeoIPCountryCSV.zip
echo -e "\nInsert geoip table to database $database"
awk -F, ' { print $3","$4","$5","$6 }' GeoIPCountryWhois.csv | sed s/\"//g > /tmp/geoip.txt
chmod 777 /tmp/geoip.txt
echo "
USE $database;

DROP TABLE IF EXISTS geoip;

CREATE TABLE geoip (
    ip_begin int unsigned,
    ip_end int unsigned,
    country varchar(2),
    country_name varchar(30)
);

LOAD DATA LOCAL INFILE '/tmp/geoip.txt'
INTO TABLE $database.geoip
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(ip_begin, ip_end, country, country_name);
" > geoip.sql
mysql -u root --password=$mysql_pass $database < geoip.sql
rm /tmp/geoip.txt
echo -e "\nFinish."

Aqui un ejemplo de como utilizar la base de datos:

#!/usr/bin/php -q
<?

if (count($_SERVER['argv']) <= 1) {
    echo "use: geoip xxx.xxx.xxx.xxx\n";
}
else {
    $ip=$_SERVER['argv'][1];	
    $out=sprintf("%u", ip2long($ip)); // don't ask why, you need this line	

    $sql="SELECT country_name FROM geoip WHERE ($out BETWEEN ip_begin AND ip_end)";	

    $link = mysql_connect('localhost','root',''); // HOST, USER, PASS
    mysql_select_db('GEOIP'); // DATABASE

    $query = mysql_query($sql,$link);	

    while ($row = @mysql_fetch_array($query,MYSQL_ASSOC)) {
        $data[] = $row;
    }	

    if (count($data) == 1) {
        echo $data[0]['country_name']."\n";
    }
    else {
        echo "Unknown\n";
    }
}
?>

Probando el script:

~$ geoip 79.130.90.12

Greece

~$ geoip 207.33.11.33

United States

~$ geoip 148.234.13.23

Mexico

Links:

http://albertux.ayalasoft.com/2008/10/01/geoip-php-script/

http://albertux.ayalasoft.com/2008/08/08/geoip-database-mysql/

 

¡Votalo! 3 votos
¡Compártelo!

        

&nbps;

&nbps;

Albertux

Sobre Albertux

Este usuario no ha completado su perfil.

 
Regístrate o haz login para participar.
¿Todavía no conoces debugmodeon?
debugmodeon es la red social para profesionales de la informática
descubre debugmodeon
 

2 comentarios en "Geolocalizacion en tu propia base de datos (MySQL)"

jsanca
jsanca escribió
hace 1 años

#1   

Esto sería perfecto para implementarlo en un WebService e integrarlo en un SOA.

Buen articulo..

 

lexlythius
lexlythius escribió
hace 1 años

#2   

gracias por el script. dos notas:

1) Esta linea:

$out=sprintf("%u", ip2long($ip)); // don't ask why, you need this line

convierte la ip de la representacion humana a su correspondiente entero de 32 bits. El problema es que si ejecutamos el PHP en un sistema de 32-bit, los número altos (primer byte mayor que 127) exceden el valor entero positivo maximo que maneja PHP. P.ej, la IP 200.80.56.187 (Argentina) resulta en -934266693 [0xc85038bb].

Hay 2 soluciones a este problema: usar un sistema de 64 bits o utilizar el valor hexadecimal con mysql:

select * from geoip
where CONV('c85038bb', 16, 10) BETWEEN ipbegin AND ipend
limit 1;

2) El problema de usar BETWEEN es que no se aprovecha la potencia de los índices de mysql. Siguiendo lo que sugieren acá http://andy.wordpress.com/2007/12/16/fast-mysql-range-queries-on-maxmind-geoip-tables/ reescribí la consulta usando subqueries:

select * from
(
select * from geoip
where ip_end >= CONV('c85038bb', 16, 10)
limit 1
) as firstouterlimit
where ip_begin <= CONV('c85038bb', 16, 10)
limit 1;

y la consulta toma 0.1150 seg contra 0.8094 de la original.

Saludos y gracias de nuevo por compartir

 
 
 
 

© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |