Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2012, 15:27   #1
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию Геолокация

Здравствуйте. Вообщем понадобилась мне определения страны, города и региона пользователя по ip. Нашел http://faniska.ru/php-kusochki/geota...eobase-ru.html
Но что-то я у меня не получается, написал там комент но хз когда ответят. Мне нужно просто в разные переменные заносит страну, город и регион. Переделал код в это:
PHP код:
<?php
    header
('Content-type: text/html; charset=UTF-8');
    
    
    include(
'geo.php');
    
$o = array(); // опции. необзятательно.
    
$o['charset'] = 'utf-8'// нужно указать требуемую кодировку, если она отличается от windows-1251
    
    
$geo = new Geo($o); // запускаем класс
    
    // этот метод позволяет получить все данные по ip в виде массива.
    // массив имеет ключи 'inetnum', 'country', 'city', 'region', 'district', 'lat', 'lng'
    
$data $geo->get_value(); 
    
    
// если нужен какой то отдельный параметр, передаем его в функцию в виде первого значения
    
$city $geo->get_value('city',true); // например, вернет название города
    
$country $geo->get_value('country',true); // вернет название страны
    
$region $geo->get_value('region',true); // вернет название региона
    # $data = $geo->get_value('district'); // вернет название района
    # lat - географическая ширина и lng - долгота
    # inetnum - диапазон ip адресов, в который входит проверяемый ip адрес
    
echo $country.$city.$region."fff";
    exit();
?>
Но выводит только fff, кто с этим сталкивался пожалуйста помогите.
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 25.03.2012, 17:41   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

var_dump($geo);
var_dump($data);

- что выводят?

curl есть/работает?
Andkorol вне форума Ответить с цитированием
Старый 25.03.2012, 17:47   #3
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

Вставил
var_dump($geo);
echo "<br>";
var_dump($data);
Выводит
object(Geo)#1 (3) { ["dirname"]=> string(28) "/home/creation/public_html/a" ["ip"]=> string(13) "85.172.221.44" ["charset"]=> string(5) "utf-8" }

NULL

Что это значит, и как можно использовать?

Что такое curl?
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 25.03.2012, 18:08   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Rost93 Посмотреть сообщение
Вставил
var_dump($data);
...
NULL
var_dump($data) - надеюсь, вставили после $data = $geo->get_value(); ?
Если после - и всё равно NULL - тогда нужно лезть в код класса и дебажить его, пытаясь понять почему выдается NULL вместо обещаного массива.
Поиск ошибок и отладка

Цитата:
Что такое curl?
Что такое curl - это необходимо для работы вашего скрипта, так написано по вашей ссылке.
Andkorol вне форума Ответить с цитированием
Старый 25.03.2012, 18:25   #5
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

Тупанул =) Переменную дата вообще удалил)
Исправил, вот вырезка что сейчас
$data = $geo->get_value();
$city = $geo->get_value('city');
var_dump($geo);
echo "<br>";
var_dump($city);
echo "<br>";
var_dump($data);
Выдает
object(Geo)#1 (3) { ["dirname"]=> string(28) "/home/creation/public_html/a" ["ip"]=> string(13) "85.172.221.44" ["charset"]=> string(5) "utf-8" }
NULL
array(0) { }

На счет curl, что-то я проигнорировал эти слова, чтобы узнать подключена или подключить нужно обращаться к хостеру или можно самому?
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 25.03.2012, 18:42   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Rost93 Посмотреть сообщение
array(0) { }
Всё равно нужно в код лезть и смотреть, что да как - то ли это значит, что просто нет инфы по данному IP (вполне может быть, для проверки в код можно поподставлять разные другие IP), то ли это баг в коде какой.

Цитата:
На счет curl, что-то я проигнорировал эти слова, чтобы узнать подключена или подключить нужно обращаться к хостеру или можно самому?
phpinfo():
Изображения
Тип файла: jpg curl.jpg (10.4 Кб, 122 просмотров)
Andkorol вне форума Ответить с цитированием
Старый 25.03.2012, 18:49   #7
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Я в нескольких проектах применял базу GeoIP - вполне справляется с большинством задач геолокации, примеры кода есть в их архивах.
Вот демо по вашему IP.
Andkorol вне форума Ответить с цитированием
Старый 25.03.2012, 18:50   #8
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

вот код geo.php получился слишком большой я удалил комментарии некоторые
PHP код:
<?php
    
class Geo
    
{
        public function 
__construct($options null) {
            
            
$this->dirname dirname(__file__);
            
            
// ip
            
if(!isset($options['ip']) OR !$this->is_valid_ip($options['ip']))
                
$this->ip $this->get_ip(); 
            elseif(
$this->is_valid_ip($options['ip']))          
                
$this->ip $options['ip'];
            
// кодировка
            
if(isset($options['charset']) && $options['charset'] && $options['charset']!='windows-1251')
                
$this->charset $options['charset'];
        }

        function 
get_value($key false$cookie true)
        {
            
$key_array = array('inetnum''country''city''region''district''lat''lng');
            if(!
in_array($key$key_array))
                
$key false;            
            
            
// если используем куки и параметр уже получен, то достаем и возвращаем данные из куки
            
if($cookie && isset($_COOKIE['geobase']))
            {
                
$data unserialize($_COOKIE['geobase']);
            } 
            else
            {
                
$data $this->get_geobase_data();
                
setcookie('geobase'serialize($data), time()+3600*24*7); //устанавливаем куки на неделю
            
}            
            if(
$key)
                return 
$data[$key]; // если указан ключ, возвращаем строку с нужными данными
            
else
                return 
$data// иначе возвращаем массив со всеми данными            
        
}

        function 
get_geobase_data()
        {
            
// получаем данные по ip
            
$link 'ipgeobase.ru:7020/geo?ip='.$this->ip;
            
$ch curl_init();
            
curl_setopt($chCURLOPT_URL$link);
            
curl_setopt($chCURLOPT_HEADERfalse);
            
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
curl_setopt($chCURLOPT_TIMEOUT3);
            
curl_setopt($chCURLOPT_CONNECTTIMEOUT3);
            
$string curl_exec($ch);    
            
            
// если указана кодировка отличная от windows-1251, изменяем кодировку
            
if($this->charset)       
                
$string iconv('windows-1251'$this->charset$string);
                       
            
$data $this->parse_string($string);
                
            return 
$data;
        }

        
        function 
parse_string($string)
        {
            
$pa['inetnum'] = '#<inetnum>(.*)</inetnum>#is';
            
$pa['country'] = '#<country>(.*)</country>#is';
            
$pa['city'] = '#<city>(.*)</city>#is';
            
$pa['region'] = '#<region>(.*)</region>#is';
            
$pa['district'] = '#<district>(.*)</district>#is';
            
$pa['lat'] = '#<lat>(.*)</lat>#is';
            
$pa['lng'] = '#<lng>(.*)</lng>#is';
            
$data = array();
            foreach(
$pa as $key => $pattern)
            {
                
preg_match($pattern$string$out);
                if(isset(
$out[1]) && $out[1])
                
$data[$key] = trim($out[1]);
            }
            return 
$data;
        }

        function 
get_ip()
        {
            
$ip false;
            if (isset(
$_SERVER['HTTP_X_FORWARDED_FOR']))
                
$ipa[] = trim(strtok($_SERVER['HTTP_X_FORWARDED_FOR'], ','));
            
            if (isset(
$_SERVER['HTTP_CLIENT_IP']))
                
$ipa[] = $_SERVER['HTTP_CLIENT_IP'];       
            
            if (isset(
$_SERVER['REMOTE_ADDR']))
                
$ipa[] = $_SERVER['REMOTE_ADDR'];
            
            if (isset(
$_SERVER['HTTP_X_REAL_IP']))
                
$ipa[] = $_SERVER['HTTP_X_REAL_IP'];
            
            
// проверяем ip-адреса на валидность начиная с приоритетного.
            
foreach($ipa as $ips)
            {
                
//  если ip валидный обрываем цикл, назначаем ip адрес и возвращаем его
                
if($this->is_valid_ip($ips))
                {                    
                    
$ip $ips;
                    break;
                }
            }
            return 
$ip;
            
        }
        
        function 
is_valid_ip($ip=null)
        {
            if(
preg_match("#^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$#"$ip))
                return 
true// если ip-адрес попадает под регулярное выражение, возвращаем true
            
            
return false// иначе возвращаем false
        
}
        

    }
?>
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 25.03.2012, 18:52   #9
Rost93
Форумчанин
 
Регистрация: 05.06.2011
Сообщений: 249
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Я в нескольких проектах применял базу GeoIP - вполне справляется с большинством задач геолокации, примеры кода есть в их архивах.
Вот демо по вашему IP.
Да я нашел эту тему, но она же платная... Но если что поможете в ее поставить?
Чтобы быть жизнеспособным, нужно приспосабливаться к любой среде. © Хохот Шамана
Rost93 вне форума Ответить с цитированием
Старый 25.03.2012, 19:01   #10
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Rost93 Посмотреть сообщение
Да я нашел эту тему, но она же платная... Но если что поможете в ее поставить?
С чего это она платная?
В статье есть ссылки на скачивание архивов с базами.
Примеры работы с базами есть в архивах:
Цитата:
Также в архивах находится небольшой пример использования базы данных на php.
Читайте - там всё написано.
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц