В этой статье будет рассматриваться способ определить страну пришедшего на ваш сайт пользователя. Применять это все можно для разных целей: как у меня, просто потому что приятно, для автоматического определения языка вывода (для "многоязычных" сайтов) или еще для чего-то... Из ПО нам понадобятся установленные PHP и PostgreSQL (можно все легко переделать и под MySQL). Так же нам необходима база соответствий IP-адресов конкретным странам, ее можно взять с этого сайта (http://inattack.ru/download/art/ip-to-country.csv.zip). Для тех, кто скачал 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 файла в базу данных применять такой код:
//Параметры для доступа к БД 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'); }
|