От автора: В этом уроке мы с вами решим задачу по автоматическому определению страны пользователя, на основании его 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-запрос, который найден диапазон значений, соответствующий определенной стране. Таким образом, наш несложный скрипт будет выглядеть так (добавляем его после открытия сессии):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$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']; |
Осталось внести небольшую правку в цикл вывода стран:
1 2 3 4 5 |
<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> |
Вот, собственно, и все. На этом наш урок завершен. До новых встреч!
Комментарии (10)