Создание привлекательной формы. Определение страны

Создание привлекательной формы. Определение страны

От автора: В этом уроке мы с вами решим задачу по автоматическому определению страны пользователя, на основании его IP-адреса.

Геотаргетинг (определение местоположения) – это довольно распространенная задача для веба. Очень часто на мультиязычных сайтах на основе полученных данных о местоположении пользователя устанавливается язык той или иной страны, чтобы пользователю было удобно пользоваться сайтом. Нам нужно определить страну пользователя с тем, чтобы автоматически выбрать ее в выпадающем списке стран.

скачать исходникискачать урок

Для решения поставленной задачи нам потребуется база диапазонов IP-адресов, которые присвоены той или иной стране. Я воспользуюсь базой стран, которые предоставляет сервис maxmind.com. По данной ссылке можно скачать базу стран. Это будет файл CSV. В дополнительных материалах вы также найдете уже готовую базу в архиве, который достаточно импортировать на сервер.

По этой ссылке вы сможете прочесть о полученной базе и о работе с ней.

Итак, давайте начнем с алгоритма. В представленной базе уже имеется список стран. Соответственно, нам не нужен теперь в скрипте статичный массив стран, теперь этот массив мы можем получать динамически – из БД.

Далее нам нужно будет определить IP пользователя. В БД имеется 2 поля (start_ip и end_ip), в которых находятся граничные значения диапазона IP-адресов страны. Однако, IP-адрес – это строка. Мы легко можем сравнить одну строку с другой, но никак не получится узнать, находится ли какая-то строка в диапазоне двух других строк. Это логично, поскольку даже само определение «диапазон строк» выглядит не совсем определенно.

Именно поэтому в базе имеются еще 2 поля (start_ip_num и end_ip_num), в которых содержатся числовые представления соответствующих граничных IP-адресов диапазона. Дело в том, что любой IP-адрес можно привести к его числовому представлению. Сделать это можно средствами PHP – функция ip2long() или средствами SQL – функция INET_ATON().

После получения числового представления IP-адреса пользователя, нам достаточно выполнить SQL-запрос, который найден диапазон значений, соответствующий определенной стране. Таким образом, наш несложный скрипт будет выглядеть так (добавляем его после открытия сессии):

$countries = array();

$db = mysqli_connect("localhost", "root", "", "test");
mysqli_set_charset($db, "utf8");

$query = "SELECT DISTINCT country_name FROM geoip ORDER BY country_name ASC";
$res = mysqli_query($db, $query);
while($row = mysqli_fetch_assoc($res)){
	$countries[] = $row['country_name'];
}

$ip = '1.1.0.200'; // $_SERVER['REMOTE_ADDR']

$query = "SELECT country_name FROM geoip
			WHERE INET_ATON('" .mysqli_real_escape_string($db,$ip). "')
				BETWEEN start_ip_num AND end_ip_num LIMIT 1";
$res = mysqli_query($db, $query);
$row = mysqli_fetch_row($res);
$ip_country = $row[0];

if( isset($_SESSION['res']['country']) )
	$ip_country = $_SESSION['res']['country'];

Осталось внести небольшую правку в цикл вывода стран:

<select name="country" id="country">
	<?php foreach($countries as $country): ?>
	<option <?php if($country == $ip_country) echo "selected" ?> value="<?=$country?>"><?=$country?></option>
	<?php endforeach; ?>
</select>

Вот, собственно, и все. На этом наш урок завершен. До новых встреч!

Фреймворк YII2: теория и первая практика

Овладейте азами фреймворка Yii2 за 5 дней!

Получить

Метки: , ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (10)

  1. дмитрий

    подскажите где взять базу городов россии для подобного решения

    • Андрей Кудлай

      В сети нужно искать) я не встречал и не задавался целью найти. Вот здесь — phpinfo.su/articles/additionally/baza_stran_i_gorodov_mira.html — можно взять базу стран и городов мира, ну а из нее уже можно простым запросом взять только города нужной страны.

  2. Абай

    Здраствуйте!Я живу в Казахстане, мне нужны только база городов Казахстана.

    • Андрей Кудлай

      Здравствуйте. В комментарии выше я давал ссылку на базу стран и городов мира, ну а из нее уже можно простым запросом взять только города нужной страны. Также можете поискать в сети, возможно есть база городов Казахстана.

  3. Юрий

    Дравствуйте, все отлично работает, есть пару нюансов,
    Используя полностью ваш скрипт со своим IP страну определяет,
    Используя последнюю базу( из сайта который в описании этой статьи) вписывая свой IP ничего не определяет, как такое может быть? притом что в новой базе
    больше чем на 30 тыс записей

    • Андрей Кудлай

      Здравствуйте. Ответ напрашивается сам собой — последняя база и база из исходников чем-то отличаются.

      • Юрий

        это я уже понял, встречный вопрос, как их объеденить что бы не дублировать записи?

        • Андрей Кудлай

          Понятия не имею, поскольку с новой БД не работал. Но подозреваю, что объединение — это плохая идея и лишняя работа. Просто сравните структуру прежней БД и новой и внесите правки в скрипт на основе структуры новой БД. Кстати, а чем не подходит БД из исходников?

          • Юрий

            я проверил новую бд и там есть диапазон моего IP но все равно не выводит, почему так может? все идентично только БД новая

          • Андрей Кудлай

            Если бы все было идентично, то и работало бы идентично, согласны? Создайте тему на нашем форуме, выложите новую БД, как будет время — я попробую посмотреть.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree