Агеев Сергей 03.10.2007г. Вводная Любому владельцу сайта интересно, откуда к нему приходят посетители, и эта статья, поможет ему в определении географии аудитории его сайта. Сервис выполняет привязку IP-адресов с точностью до конкретного населенного пункта, что дает возможность четкого определения аудитории. Подготовка Первым делом надо зарегистрировать в системе свой сайт, с которого будут исходить запросы к базе данных. Регистрация по этому адресу http://geo.stat-info.ru/reg.html. После регистрации на указанный e-mail будет выслан код доступа к базе данных, который нужно указывать при каждом запросе к http://geo.stat-info.ru. Скрипт Данный сервис имеет один неприятный момент, а именно ограничение на количество запросов с одного сайта, на момент написания этой статьи можно было послать не более 500 запросов в 1 час. Скорей всего это ограничение сделано для экономии трафика, но нам оно не помешает, т.к. мы будем сохранять результаты обращения к http://geo.stat-info.ru в своей базе данных. И так, создадим таблицу в MySQL Code CREATE TABLE `geo_ip` ( `ip` BIGINT( 10 ) NOT NULL , `country` VARCHAR( 35 ) NOT NULL , `city` VARCHAR( 35 ) NOT NULL , UNIQUE ( `ip` ) ) TYPE = MYISAM ; В данной таблице будут храниться IP адреса с привязкой к стране и городу, поле IP имеет тип BIGINT т.к. выгоднее хранить не сам IP адрес, а результат работы функции sprintf('%u',ip2long($ip)). Получаем IP адрес пользователя Code $ip=$_SERVER['REMOTE_ADDR']; Преобразуем IP адрес Code $ip_revers=sprintf('%u',ip2long($ip)); Код, полученный при регистрации на сайте http://geo.stat-info.ru/ Code $code='хххххххххххххххххххххххххххххххх'; Подключаемся к MYSQL серверу Code if(!(@$dblink = mysql_connect('localhost' , 'root' , ''))) { print 'Невозможно подключиться к базе данных!<br>'; exit(); } Выбираем кодировку MYSQL сервера Code if(!($dbresult=mysql_query("SET NAMES cp1251;", $dblink))) { print 'Невозможно установить кодировку соединения с базой данных!<br>'; exit(); } Выбираем базу данныхCode if(!($dbresult=mysql_query("USE TEST" , $dblink))) { print 'Невозможно выбрать базу данных!<br>'; exit(); } Пытаемся получить информацию по IP адресу из MYSQL Code $zapros="SELECT * FROM `geo_ip` where `ip` = $ip_revers"; if(!($dbresult = mysql_query($zapros, $dblink))) { print 'Невозможно выполнить запрос к базе данных!<br>'; exit(); } Проверяем результат запросаCode if(!($result=mysql_fetch_assoc($dbresult))) { Информация о IP адресе в базе данных отсутствует Создаём XML парсерCode $parser=xml_parser_create(); Посылаем запрос к сайту http://geo.stat-info.ru/ и принимаем целый файл (XML)Code $data=file_get_contents("http://geo.stat-info.ru/xml/$ip/$code/"); Обрабатываем результатCode xml_parse_into_struct($parser,$data,$structure,$index); Удаляем XML парсерCode xml_parser_free($parser); В цикле обрабатываем структуру XML и получаем нужные данные (город и страну), т.к. ответ сервера в кодировке UTF-8 то сразу перекодируем в WINDOWS-1251Code foreach($structure as $key) { if($key['tag']=='CITY') $result['city']=iconv('UTF-8','WINDOWS-1251',$key['value']); elseif($key['tag']=='COUNTRY') $result['country']=iconv('UTF-8','WINDOWS-1251',$key['value']); } Далее записываем данные в свою базу данныхCode $zapros="INSERT INTO `geo_ip` (`ip`,`country`,`city`) VALUES ($ip_revers,'{$result['country']}','{$result['city']}')"; if(!($dbresult = mysql_query($zapros, $dblink))) { print 'Невозможно сохранить результат в базе данных!<br>'; exit(); } } В массиве $result содержатся необходимые данные Code print '<pre>'; print_r($result); print '</pre>';
Удачного геотаргетинга |