Определение страны человека пришедшего на сайт

В этой статье будет рассматриваться способ определить страну пришедшего на
ваш сайт пользователя. Применять это все можно для разных целей: как у меня, просто потому что приятно, для автоматического определения языка вывода (для "многоязычных" сайтов) или еще для чего-то...
Из ПО нам понадобятся установленные PHP и PostgreSQL (можно все легко переделать и под MySQL). Так же нам необходима база соответствий IP-адресов конкретным странам, ее можно взять с
этого
сайта. Для тех, кто скачал SQL файл, я описывать процесс занесения в базу не буду - думаю и так все понятно, для остальных же приведу как пример один из вариантов, хотя конечно существует великое множество решений задачи о перегонке данных в формате CSV в базу данных.
Для начала необходимо создать таблицу в базе данных, назовем ее countries:

CREATE TABLE countries (
short character varying(2),
nshort character varying(3),
country_name character varying(50),
start_ip bigint,
stop_ip bigint
);

Итак для превращения CSV файла в базу данных применять такой код:

<?php
//Параметры для доступа к БД
define ("DB_USER", "dbuser");
define ("DB_PASSWORD", "dbpasswd");
define ("DB_DB", "mydb");
$conn_str=sprintf("dbname=%s user=%s password=%s", DB_DB, DB_USER, DB_PASSWORD);
$conn=pg_connect($conn_str);
//Путь к CSV файлу
$csv="/usr/home/iptc/ip-to-country.csv";
$countrys=file($csv);
while (list(,$value)=each($countrys)) {
//Разборка строки для занесения в базу
if (preg_match('/"([0-9]+)","([0-9]+)", "(\w+)","(\w+)","(.+)"/',$value,$match)) {
// Формируем и отправляем запрос к БД
pg_query ($conn, "INSERT INTO countries (start_ip, stop_ip, short, nshort, country_name) values (".$match[1].",".$match[2].",'".$match[3]."','".$match[4]."','".$match[5]."')");
}
}
echo ("OK!");
?>

Тут следует отметить, что на не очень быстрых серверах возможно вылетание скрипта по таймауту (см. параметр max_execution_time в
php.ini). На последнем этапе подготовки - создадим индекс для более быстрого поиска: CREATE INDEX ips ON countries USING btree
(start_ip, stop_ip);  Определять из какой страны пришел пользователь мы будем по переменной $_SERVER["REMOTE_ADDR"] которая в большинстве случаев содержит IP адрес прокси-сервера, хотя бывают конечно варианты...
В моём случае выводим приветствие с указанием строки и подставляю картинку соответствующего флага, кому это не нужно легко смогут
подчистить.

<?php
// Запрос к базе данных
$result=pg_query($conn, sprintf("SELECT short, country_name FROM countries WHERE start_ip<'%u' AND
stop_ip>'%u'",ip2long($_SERVER["REMOTE_ADDR"]), ip2long($_SERVER["REMOTE_ADDR"])));
// Разбираем результат
if (pg_num_rows($result)==1) {
$row = pg_fetch_object($result,0);
printf("<center>You are from:<br /><img src=\"./images/flags/%s.gif\"><br /><strong>%s</strong></center><hr />",strtolower($row->short),ucwords(strtolower($row->absolute)));
}
else {
print('Нет данных для этого IP');
}

Похожие материалы