В этой статье будет рассматриваться способ определить страну пришедшего на
ваш сайт пользователя. Применять это все можно для разных целей: как у меня, просто потому что приятно, для автоматического определения языка вывода (для «многоязычных» сайтов) или еще для чего-то…
Из ПО нам понадобятся установленные 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’); 
}

Оставить мнение

Check Also

Хакер ищет авторов. Читатель? Хакер? Программист? Безопасник? Мы тебе рады!

Восемнадцать лет мы делаем лучшее во всем русскоязычном пространстве издание по IT и инфор…