|
 |
Путь: >
Готовые решения
Готовые решения
Автор: - Crocodile
Дата публикации - 21.5.2005
Просмотров: - 7847
Определение страны пришедшего (PHP, PostgreSQL)
[p]Зачем нам это нужно[/p]
В этой статье будет рассматриваться способ определить страну пришедшего на Ваш сайт пользователя. Применять это все можно для разных целей: как у меня, просто потому что приятно, для автоматического определения языка вывода (для "многоязычных" сайтов) или еще для чего-то...
[p]Что нам понадобится[/p]
Из ПО нам понадобятся установленные PHP и PostgreSQL (можно все легко переделать и под MySQL). Так же нам необходима база соответствий IP-адресов конкретным странам, ее можно взять с официального сайта по этому адресу url=http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip,]http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip,/url] или с этого сервера вместе с php классом ip2country (см. файловый архив)
[nb]! Внимание ! На официальном сайте может присутствовать более свежая версия! [/nb]
Файл находящийся у нас на сайте имеет последнее обновление от 14.02.2004 года.
[p]Подготовка базы[/p]
Для тех кто не уверен что нужна база, а верит в реализацию на файлах отвечу одно - пробуйте, дай Бог ресурсов Вашему серверу и терпения Вашим пользователям.
Для тех кто скачал SQL файл я описывать процесс занесения в базу не буду - думаю и так все понятно, для остальных же приведу как пример свой вариант, хотя конечно существует великое множество решений задачи о перегонке данных в формате CSV в базу данных.
Для начала необходимо создать таблицу в базе данных, назовем ее [b]countries[/b]:
[code]CREATE TABLE countries (
short character varying(2),
nshort character varying(3),
country_name character varying(50),
start_ip bigint,
stop_ip bigint
);[/code]
Итак для превращения CSV файла в базу данных я применял такой код:
[php]
<?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!");
?>[
/php]
[nb]Тут следует отметить, что на не очень быстрых серверах возможно вылетание скрипта по таймауту (см. параметр max_execution_time в php.ini). Или можно в первую строку дописать [b]set_tile_limit=0;[/b] - но делать это надо очень острожно тк. это может привести к зависанию сервера[/nb]
На последнем этапе подготовки - создадим индекс для более быстрого поиска:
[code]CREATE INDEX ips ON countries USING btree (start_ip, stop_ip);[/code]
Ну вот, можно считать что база готова и переходить к этапу написания скрипта для работы с ней.
[p]Собственно определение[/p]
Определять из какой страны пришел пользователь мы будем по переменной $_SERVER['REMOTE_ADDR'] которая в большинстве случаев содержит IP адрес прокси-сервера, хотя бывают конечно варианты...
В моем случае я вывожу приветствие с указанием строки и подставляю картинку соответствующего флага, кому это не нужно легко смогут подчитсить. Картинки флагов можно взять здесь - flag.zip или с моего сайта flag.zip (159046 байт).
Итак, код проверки прост и понятен (по крайней мере мне...)
[php]
<?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');
}
?>[
/php]
Кажеться все... примерно таким образом это работает на url=http://www.crocodile.sumy.ua/.]http://www.crocodile.sumy.ua/./url]
По всем вопросам пишите, стучите в асю и тд. и т.п.
Обсудить в ФОРУМе - комментариев ()
Путь: >
Готовые решения
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|