Геолокация - определение страны по IP
Определение страны по 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"
- }else {
- }
- //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 в массив
- //Получаем код страны в формате ISO-3166-1
- //Получаем название страны
- $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">
- <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

Комментарии
#массив
$city = array(
['Kiev']=>'Киев',
...
);
и далее при выводе города используя [city] => Kiev, делать выборку из массива по ключу Kiev
Вот так к примеру
echo $city[$geodata[ 'city']];
Пишет: Fatal error: Cannot redeclare geoip_country_c ode_by_name() in /home/site_x/www/tolxi.ru/test/gip/geoip.inc on line 384
что за...... =(