::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Вакансия PHP-программист, Днепропетровск...
  - Проблема с передачей переменной в PHP ск...
  - Как хранить конфигурацию cms'ки?
  - Проблема с сортировкой массива
  - коллизии md5
  - Странный глюк функции date
  - Скроллинг в iframe


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Статьи > Готовые решения

Готовые решения

Автор: - 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_DBDB_USERDB_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($connsprintf("SELECT short, country_name FROM countries WHERE start_ip&lt;'%u' AND stop_ip&gt;'%u'",ip2long($_SERVER["REMOTE_ADDR"]),ip2long($_SERVER["REMOTE_ADDR"]))); 
// Разбираем результат 
if (pg_num_rows($result)==1) { 
$row pg_fetch_object($result,0); 
printf("&lt;center&gt;You are from:&lt;br /&gt;&lt;img src=\"./images/flags/%s.gif\"&gt;&lt;br /&gt;&lt;strong&gt;%s&lt;/strong&gt;&lt;/center&gt;&lt;hr /&gt;",strtolower($row-&gt;short),ucwords(strtolower($row-&gt;absolute))); 

else { 
print(
'Нет данных для этого IP'); 

?>[

/php]

Кажеться все... примерно таким образом это работает на url=http://www.crocodile.sumy.ua/.]http://www.crocodile.sumy.ua/./url]

По всем вопросам пишите, стучите в асю и тд. и т.п.



Обсудить в ФОРУМе - комментариев ()


Путь: Статьи > Готовые решения

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005