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

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии