{"id":29,"date":"2005-05-20T14:14:01","date_gmt":"2005-05-20T19:14:01","guid":{"rendered":"http:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/averiguar-la-ubicacion-del-visitante-en-php\/"},"modified":"2014-03-16T19:01:33","modified_gmt":"2014-03-17T00:01:33","slug":"ubicacion-visitante-php","status":"publish","type":"post","link":"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/","title":{"rendered":"Detectar pais del visitante en PHP"},"content":{"rendered":"<p><a href=\"http:\/\/www.php.net\/\"><img alt=\"PHP Logo\" src=\"http:\/\/www.latindevelopers.com\/ivancp\/wp-content\/php.gif\" align=\"right\" hspace=\"10\/\" vspace=\"10\" \/> <\/a> Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras p\u00e1ginas, para ello utilizamos herramientas muy \u00fatiles como contadores de visitas, analizadores de tr\u00e1fico, etc., pero no siempre tenemos lo que queremos, no hay como hacer un script con tus propias manos.<\/p>\n<p>Hace mucho tiempo encontr\u00e9 una base de datos (actualizada peri\u00f3dicamente) que contiene <del>todos<\/del> la mayor\u00eda de n\u00fameros IP que se pueden encontrar en la red. Estos est\u00e1n almacenados en forma de rangos y contiene el dato que nos interesa <strong>el Pa\u00eds<\/strong>. Con esta base de datos es f\u00e1cil determinar el pa\u00eds de procedencia del visitante a partir del numero\u00a0 IP.<\/p>\n<p><img loading=\"lazy\" class=\"alignleft\" title=\"MaxMind\" alt=\"\" src=\"http:\/\/www.maxmind.com\/images\/maxmind_logo.gif\" width=\"191\" height=\"46\" \/>MaxMind es una empresa que provee este tipo de servicios y nos brinda un archivo <strong>libre<\/strong> (pero limitado) que podemos aprovechar.\u00a0 http:\/\/www.maxmind.com\/app\/geolitecountry , solo tenemos que descargar el archivo e instalarlo en nuestra base de datos MySQL, sigan los pasos:<\/p>\n<p>Paso 1: Descargar y Descomprimir la base de datos MaxMind (formato .csv):<\/p>\n<pre lang=\"bash\">wget http:\/\/www.maxmind.com\/download\/geoip\/database\/GeoIPCountryCSV.zip\r\nunzip GeoIPCountryCSV.zip  #contiene el archivo GeoIPCountryWhois.csv<\/pre>\n<p>Esta es una vista previa del archivo GeoIPCountryWhois.csv<\/p>\n<pre lang=\"cpp\">...\r\n\"190.8.128.0\",\"190.8.159.255\",\"3188228096\",\"3188236287\",\"PE\",\"Peru\"\r\n\"190.8.160.0\",\"190.8.163.255\",\"3188236288\",\"3188237311\",\"PA\",\"Panama\"\r\n\"190.8.164.0\",\"190.8.167.255\",\"3188237312\",\"3188238335\",\"VE\",\"Venezuela\"\r\n\"190.8.176.0\",\"190.8.179.255\",\"3188240384\",\"3188241407\",\"CO\",\"Colombia\"\r\n\"190.8.180.0\",\"190.8.183.255\",\"3188241408\",\"3188242431\",\"EC\",\"Ecuador\"\r\n\"190.8.184.0\",\"190.8.191.255\",\"3188242432\",\"3188244479\",\"AR\",\"Argentina\"\r\n\"190.8.192.0\",\"190.8.255.255\",\"3188244480\",\"3188260863\",\"CO\",\"Colombia\"\r\n\"190.9.0.0\",\"190.9.31.255\",\"3188260864\",\"3188269055\",\"AR\",\"Argentina\"\r\n\"190.9.32.0\",\"190.9.47.255\",\"3188269056\",\"3188273151\",\"VE\",\"Venezuela\"\r\n...<\/pre>\n<p>Luego debemos crear la tabla donde vamos a importar esos datos en formato csv:<\/p>\n<pre lang=\"mysql\">CREATE TABLE ipdatabase\r\n(\r\n  str_ip_from varchar(15),\r\n  str_ip_to varchar(15),\r\n  ip_from int unsigned,\r\n  ip_to int unsigned,\r\n  country_code2 char(2),\r\n  country_name varchar(50),\r\n  KEY ip_from (ip_from),\r\n  KEY ip_to (ip_to)\r\n);<\/pre>\n<p>Es importante que los campos <code>ip_from<\/code> e <code>ip_to<\/code> sean <code>int unsigned<\/code> por que guardaremos n\u00fameros realmente grandes.<\/p>\n<pre lang=\"mysql\">LOAD DATA LOCAL INFILE '\/ruta_hacia\/GeoIPCountryWhois.csv'\r\nINTO TABLE ipdatabase\r\nFIELDS TERMINATED BY ',' ENCLOSED BY '\"'\r\nLINES TERMINATED BY '\\n';<\/pre>\n<p>Para poder mostrar las im\u00e1genes debemos tener las im\u00e1genes de las banderas de todos los pa\u00edses, pueden descargar un pack banderas en diferentes tama\u00f1os de: <a href=\"http:\/\/speckyboy.com\/2010\/08\/04\/top-10-country-flag-icon-sets\/\">http:\/\/speckyboy.com\/2010\/08\/04\/top-10-country-flag-icon-sets\/<\/a><\/p>\n<p>Ahora todo esta listo para que podamos escribir el c\u00f3digo PHP que determinara el registro al cual pertenece un determinado numero de IP:<\/p>\n<pre lang=\"php\">$link = mysql_connect(\"localhost\" , \"ipdatabase\", \"pwd\");\r\nmysql_select_db(\"ipdatabase\",$link);\r\n$sql = \"SELECT lcase(country_code2) as code,country_name as name \".\r\n\"FROM ipdatabase \".\r\n\"WHERE ip_from &lt;= inet_aton('{$_SERVER['REMOTE_ADDR']}') \".        \r\n\"AND ip_to &gt;= inet_aton('{$_SERVER['REMOTE_ADDR']}') \";\r\nif($res = mysql_query($sql,$link)) \r\n{\r\nif(mysql_affected_rows($link) &gt; 0 &amp;&amp; $row = mysql_fetch_array($res))\r\n    $im = imagecreatefrompng(\"..\/images\/flags\/\".$row['code'].\".png\");\r\nelse\r\n    $im = imagecreatefrompng(\"..\/images\/flags\/-.png\");\r\nheader('Content-Type: image\/png');\r\nimagepng($im);\r\nimagedestroy($im);\r\nmysql_free_result($res);\r\n}\r\nelse\r\n{\r\necho mysql_error($link);\r\n}\r\nmysql_close($link);<\/pre>\n<p>El resultado del script anterior es el siguiente:<\/p>\n<blockquote><p>Usted nos esta visitando desde : <img alt=\"\" src=\"http:\/\/www.latindevelopers.com\/scripts\/countryflag.php\" \/><\/p><\/blockquote>\n<p>Ustedes pueden personalizar el c\u00f3digo PHP para publicarlo en sus paginas web.<\/p>\n<p>Espero les sirva.<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Compartelo:<\/h3><div class=\"sd-content\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-29\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=facebook\" target=\"_blank\" title=\"Haz clic para compartir en Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-29\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=twitter\" target=\"_blank\" title=\"Haz clic para compartir en Twitter\"><span>Twitter<\/span><\/a><\/li><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>M\u00e1s<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-email\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-email sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=email\" target=\"_blank\" title=\"Haz clic para enviar por correo electr\u00f3nico a un amigo\"><span>Correo electr\u00f3nico<\/span><\/a><\/li><li class=\"share-print\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-print sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/\" target=\"_blank\" title=\"Haz clic para imprimir\"><span>Imprimir<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-29\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=linkedin\" target=\"_blank\" title=\"Haz clic para compartir en LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras p\u00e1ginas, para ello utilizamos herramientas muy \u00fatiles como contadores de visitas, analizadores de tr\u00e1fico, etc., pero no siempre tenemos lo que queremos, no hay como hacer un &hellip; <a href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Compartelo:<\/h3><div class=\"sd-content\"><ul><li class=\"share-facebook\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-facebook-29\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=facebook\" target=\"_blank\" title=\"Haz clic para compartir en Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-twitter-29\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=twitter\" target=\"_blank\" title=\"Haz clic para compartir en Twitter\"><span>Twitter<\/span><\/a><\/li><li><a href=\"#\" class=\"sharing-anchor sd-button share-more\"><span>M\u00e1s<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><div class=\"sharing-hidden\"><div class=\"inner\" style=\"display: none;\"><ul><li class=\"share-email\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-email sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=email\" target=\"_blank\" title=\"Haz clic para enviar por correo electr\u00f3nico a un amigo\"><span>Correo electr\u00f3nico<\/span><\/a><\/li><li class=\"share-print\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"\" class=\"share-print sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/\" target=\"_blank\" title=\"Haz clic para imprimir\"><span>Imprimir<\/span><\/a><\/li><li class=\"share-end\"><\/li><li class=\"share-linkedin\"><a rel=\"nofollow noopener noreferrer\" data-shared=\"sharing-linkedin-29\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.latindevelopers.com\/ivancp\/2005\/05\/ubicacion-visitante-php\/?share=linkedin\" target=\"_blank\" title=\"Haz clic para compartir en LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div><\/div><\/div>","protected":false},"author":1,"featured_media":357,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[7,10],"tags":[12,18],"jetpack_featured_media_url":"https:\/\/www.latindevelopers.com\/ivancp\/wp-content\/uploads\/php-logo.jpg","jetpack_shortlink":"https:\/\/wp.me\/p1tEO5-t","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/29"}],"collection":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":12,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/29\/revisions"}],"predecessor-version":[{"id":771,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/posts\/29\/revisions\/771"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/media\/357"}],"wp:attachment":[{"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/media?parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/categories?post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.latindevelopers.com\/ivancp\/wp-json\/wp\/v2\/tags?post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}