Геолокация - определение страны по IP

Четверг, 03 Февраль 2011

 

Определение страны по IP посетителя сайта довольно частная задача но все же она может возникнуть например для вывода определенной информации для посетителей конкретной страны, или же вывода текстов на языке страны посетителя. Ну задачи бывают разные, здесь уж кому что требуется. Для решения этой задаи привожу пример кода который использует базу IP адресов от MaxMind LLC и функции работы с этой базой.

 

Для демонстрации была выбрана такая задача - выводить на страницу название страны посетителя сайта и флаг этой страны. Выглядит это так - Геолокация - определение страны по IP.

 

А реализуется следующим образом: из глобального массива $_SERVER получаем IP посетителя сайта, далее по нему осуществляем поиск в базе данных IP адресов от MaxMind LLC, и выводим нужную нам информацию об этом IP. Массив данных об IP пользователя будет содерать следующее:

 

  •  
  • [country_code] => UA
  • [country_code3] => UKR
  • [country_name] => Ukraine
  • [region] => 13
  • [city] => Kiev
  • [postal_code] =>
  • [latitude] => 50,4333
  • [longitude] => 30,5167
  • [area_code] =>
  • [dma_code] =>
  • [metro_code] =>
  • [continent_code] => EU)
  •  

 

Для поставленной задачи из этого массива нам требуется только код страны в формате ISO-3166-1, и название страны, это элементы масива с ключами country_code и country_name. country_code - содержит код страны в верхнем регистре и он будет использоватся для указании имени файла флага страны, которые проименованы по этим же кодам в формате ISO-3166-1 (Russian - RU имя файла "ru.png"), поэтому необходимо привести код страны к нижнему регистру используя функцию strtolower.

 

Ну а теперь и сам код примера:

 

  •  
  • //ставим локаль, на случай если на сервере она не настроена то не будет работать "strtolower"
  • if(substr(PHP_OS, 0, 3) == 'WIN'){
  • setlocale(LC_ALL, 'Russian_Russia.1251');
  • }else {
  • setlocale(LC_ALL, 'ru_RU.CP1251');
  • }
  •  
  • //Geolocation
  • include("gip/geoip.inc");
  • include("gip/geoipcity.inc");
  •  
  • //определяем IP посетителя
  • $ip = $_SERVER['REMOTE_ADDR'];
  •  
  • //Соединяемся с базой
  • $gi = geoip_open("gip/GeoLiteCity.dat", GEOIP_STANDARD);
  •  
  • //Читаем данные из базы по полученому IP
  • $geodata = GeoIP_record_by_addr($gi, $ip);
  •  
  • //Закрываем соединение с базой
  • geoip_close($gi);
  •  
  • //Преобразовываем обьект данных об IP в массив
  • $geodata = (array)$geodata;
  •  
  • //Получаем код страны в формате ISO-3166-1
  • $contry_code = strtolower($geodata['country_code']);
  •  
  • //Получаем название страны
  • $contry_name = $geodata['country_name'];
  •  
  • ?>
  •  
  • <html>
  • <body>
  • <div class="wrapper">
  • <p>
  • Ваша страна: <strong><?php echo $contry_name; ?></strong>
  • <img alt="" src="flags/64/<?php echo $contry_code; ?>.png"/>
  • </p>
  • </div>
  • </body>
  • </html>
  •  

 

База IP адресов с информацией о них находится в бинарном файле GeoLiteCity.dat именно по ней и осуществляется поиск.

 

Получив нужные данные, выводим их:

 

  •  
  • <body>
  • <div class="wrapper">
  • <p>Ваша страна: <?php echo $contry_name; ?>
  • <img alt="" src="flags/64/<?php echo $contry_code; ?>.png"/></p>
  • </div>
  • </body>
  •  

 

Обратите внимание на путь к картинке-флагу, и на то как он формируется $contry_code - содержит код страны ISO-3166-1, приведенный к нижнему регистру и используется в качестве имени файла флажка, которые также проименованы по стандарту ISO-3166-1, скачать все флажки можно по этой ссылке Флаги стран в формате ISO-3166-1.

 

Скачать пример: Геолокация по IP.

 

PS. Читайте последние записи RSS Подписка на RSS

 

Метки:

Комментарии 

 
anonim Пятница, 25 Февраль 2011

Круто , а нельзя немного доработать , чтобы все города выводидись в кирилице , т е на русском языке, ну или как это сделать

 

 
 
anonim Четверг, 03 Март 2011

Для этого нужно перевести все города на кириллицу, или найти базу в киррилице, а затем сделать так:
#массив

$city = array(
['Kiev']=>'Киев',
...
);

и далее при выводе города используя [city] => Kiev, делать выборку из массива по ключу Kiev
Вот так к примеру

echo $city[$geodata[ 'city']];

 

 
 
anonim Среда, 16 Март 2011

Не работает демо...и сам скрипт тоже.

 

 
 
anonim Среда, 16 Март 2011

Какая у вас страна? мне выводит Украина и флажок, проверел только что. Ошибки какието вылетают?

 

 
 
anonim Среда, 28 Сентябрь 2011

Случайно был удален скрипт с сервера, теперь он снова загружен и доступен для скачивания!

 

 
 
Def Среда, 04 Январь 2012

Полезный и приятный блог! Спасибо за скрипт.

 

 
 
Dexter Воскресенье, 15 Январь 2012

Спасибо за статью, будем испытывать =)

 

 
 
Dexter Воскресенье, 15 Январь 2012

У вас на сайте пример работает а у меня нифига =( Я разочарован
Пишет: Fatal error: Cannot redeclare geoip_country_c ode_by_name() in /home/site_x/www/tolxi.ru/test/gip/geoip.inc on line 384
что за...... =(

 

 
 
Dexter Понедельник, 16 Январь 2012

ПОМогите исправить, почему у меня не фурычит. Дайте плиз рабочий скрипт. =) Будете молодци :)

 

 

Добавить комментарий