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

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

 

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

 

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

 

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

 

 
Array (
  [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

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

 

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

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

 

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

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

 

 
 
anonim Воскресенье, 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
что за...... =(

 

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

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

 

 
 
anonim Среда, 27 Ноябрь 2013

Я что то не заметил, что тут город выводится... Или я слепой? Страну выводит, а вот город нет, хотя файл в папке лежит, а тут про него ни чего не сказано

 

 
 
anonim Понедельник, 06 Январь 2014

Допиши:
$city_name = $geodata['city'];
И получишь город.

 

 
 
anonim Понедельник, 06 Январь 2014

Спасибо большое автору, всё прекрасно работает:
http://phpsait.ru/IP_info.php
Но заметил, город неточно определяет. базы, видимо устарели (надо думать, они 2010 года)
MaxMind LLC формат новых баз изменил, в формате .mmdb
Как с ними работать? (простая подстановка не помогает)

 

 
 
anonim Среда, 18 Июнь 2014

Зашел через немецкий прокси - показал United Kingdom. Это неправильный результат.

 

 
 
anonim Среда, 03 Сентябрь 2014

Что-то у вас не так. Я нахожусь в России, а мне показывает, что моя страна - Кювейт

 

 

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