Detectar pais del visitante en PHP

PHP Logo 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., pero no siempre tenemos lo que queremos, no hay como hacer un script con tus propias manos.

Hace mucho tiempo encontré una base de datos (actualizada periódicamente) que contiene todos la mayoría de números IP que se pueden encontrar en la red. Estos están almacenados en forma de rangos y contiene el dato que nos interesa el País. Con esta base de datos es fácil determinar el país de procedencia del visitante a partir del numero  IP.

MaxMind es una empresa que provee este tipo de servicios y nos brinda un archivo libre (pero limitado) que podemos aprovechar.  http://www.maxmind.com/app/geolitecountry , solo tenemos que descargar el archivo e instalarlo en nuestra base de datos MySQL, sigan los pasos:

Paso 1: Descargar y Descomprimir la base de datos MaxMind (formato .csv):

wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip GeoIPCountryCSV.zip  #contiene el archivo GeoIPCountryWhois.csv

Esta es una vista previa del archivo GeoIPCountryWhois.csv

...
"190.8.128.0","190.8.159.255","3188228096","3188236287","PE","Peru"
"190.8.160.0","190.8.163.255","3188236288","3188237311","PA","Panama"
"190.8.164.0","190.8.167.255","3188237312","3188238335","VE","Venezuela"
"190.8.176.0","190.8.179.255","3188240384","3188241407","CO","Colombia"
"190.8.180.0","190.8.183.255","3188241408","3188242431","EC","Ecuador"
"190.8.184.0","190.8.191.255","3188242432","3188244479","AR","Argentina"
"190.8.192.0","190.8.255.255","3188244480","3188260863","CO","Colombia"
"190.9.0.0","190.9.31.255","3188260864","3188269055","AR","Argentina"
"190.9.32.0","190.9.47.255","3188269056","3188273151","VE","Venezuela"
...

Luego debemos crear la tabla donde vamos a importar esos datos en formato csv:

CREATE TABLE ipdatabase
(
  str_ip_from varchar(15),
  str_ip_to varchar(15),
  ip_from int unsigned,
  ip_to int unsigned,
  country_code2 char(2),
  country_name varchar(50),
  KEY ip_from (ip_from),
  KEY ip_to (ip_to)
);

Es importante que los campos ip_from e ip_to sean int unsigned por que guardaremos números realmente grandes.

LOAD DATA LOCAL INFILE '/ruta_hacia/GeoIPCountryWhois.csv'
INTO TABLE ipdatabase
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Para poder mostrar las imágenes debemos tener las imágenes de las banderas de todos los países, pueden descargar un pack banderas en diferentes tamaños de: http://speckyboy.com/2010/08/04/top-10-country-flag-icon-sets/

Ahora todo esta listo para que podamos escribir el código PHP que determinara el registro al cual pertenece un determinado numero de IP:

$link = mysql_connect("localhost" , "ipdatabase", "pwd");
mysql_select_db("ipdatabase",$link);
$sql = "SELECT lcase(country_code2) as code,country_name as name ".
"FROM ipdatabase ".
"WHERE ip_from <= inet_aton('{$_SERVER['REMOTE_ADDR']}') ".        
"AND ip_to >= inet_aton('{$_SERVER['REMOTE_ADDR']}') ";
if($res = mysql_query($sql,$link)) 
{
if(mysql_affected_rows($link) > 0 && $row = mysql_fetch_array($res))
    $im = imagecreatefrompng("../images/flags/".$row['code'].".png");
else
    $im = imagecreatefrompng("../images/flags/-.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
mysql_free_result($res);
}
else
{
echo mysql_error($link);
}
mysql_close($link);

El resultado del script anterior es el siguiente:

Usted nos esta visitando desde :

Ustedes pueden personalizar el código PHP para publicarlo en sus paginas web.

Espero les sirva.

MySQL cada vez mejor

MySQL esta con nosotros desde hace ya mucho tiempo. Hemos podido notar que este gestor esta evolucionando cada vez y se esta convirtiendo en el gestor de datos que todos desearíamos que fuese.

MySQL se ha convertido en una seria amenaza para los gestores de datos como Oracle o SQL Server.

Segun un artíulo que encontre por la red:

MySQL toma nuevo impulso y ya es una seria amenaza para Oracle, IBM y Microsoft
Según varios analistas, la base de datos de código abierto MySQL puede convertirse en una serie competencia para gigantes como Oracle, IBM y hasta Microsoft. La última versión de esta plataforma libre incluye nuevas características -como sub-búsquedas y un nuevo formato binario- que fortalecen aún más su posición como una alternativa a las grandes empresas.

Estas no son novedades para quienes utilizamos constantemente MySQL, pero el resto ya lo esta empezando a tomar en serio.

MySQL y Visual C++

MySQL es un gestor de base de datos en plena evolución, inicialmente captó mi atención (como muchos) por que es liviano, rapido, confiable. Tiene algunos problemas en situaciones extremas, aun asi sigo siendo su fiel seguidor.

Como programador debo comentarles que, como casi todos los gestores, MySQL provee unas API’s que estan escritas en C/C++ las cuales pueden incluirse para implementar aplicaciones de acceso a base de datos sin necesidad de ODBC y esas cosas.

Para ello escribí un articulo respecto a eso: Como acceder a una base de datos MySQL desde Visual C++. Seguramente los seguidores mas romanticos del movimiento de Software Libre (el cual apoyo) se escandalicen al ver tal combinación, pero quienes utilizamos Visual C++ sabemos que no existe mejor compilador para Windows.

Estoy escribiendo un programa con las librerías GTK para que pueda correr en Linux. Pronto lo tendré listo.

Mientras tanto pueden descargar el articulo incluyendo el codigo fuente del proyecto y algunos archivos necesarios en esta dirección:

https://www.latindevelopers.com/ivancp/articulos/mysqlapi.pdf

Para que puedan tener mas referencia respecto a las API’s de MySQL pueden visitar:

http://dev.mysql.com/doc/mysql/en/mysql-apis.html

DBDesigner

Hace muchos años que desarrollo aplicaciones en Visual C++, casi todas las aplicaciones que desarrollé tienen que interactuar con bases de datos.

Mi gestor de base de datos preferido es MySQL, las razones las explicare en otra ocasión. Pero este post es para comentarles sobre la fabulosa herramienta de modelamiento de datos DBDesigner, que esta en su Version 4.

Esta herramienta ademas de tener una interfaz muy bien diseñada (utilizando tecnicas avanzadas), corre tambien en Linux.

Personalmente esoy acostumbrado a tener mis datos en forma de script’s SQL, DBDesigner tiene funcionalidad de obtener el modelo a partir de una base de datos existente (Ingeniería Inversa) lo que es muy util.

Hay muchas funcionalidades que tiene esta herramienta, se las recomiendo.

Pueden descargarse la ultima version desde http://www.fabforce.net/dbdesigner4/ Se distribuye gratuitamente bajo licencia GNU GPL.

Update!: DBDesigner esta descontinuado!, el sucesor es MySQL WorkBench