Вход Регистрация
Файл: core/classes/geo.class.php
Строк: 90
<?php

if (!defined('CMS')) { die('Access Denied!'); }

class 
Geo {

    public function 
__construct($options null) {

        
// ip
        
if (!isset($options['ip']) || !$this->is_valid_ip($options['ip'])) {

            
$this->ip $this->get_ip(); 
        }
        else {

            if (
$this->is_valid_ip($options['ip'])) {
          
                
$this->ip $options['ip'];
            }
            else {

                
$this->ip $this->get_ip();
            }
        }

        
// кодировка
        
if (isset($options['charset']) && $options['charset'] && $options['charset'] != 'windows-1251') {

            
$this->charset $options['charset'];
        }
    }

   
/**
    * функция возвращет конкретное значение из полученного массива данных по ip
    * @param string - ключ массива. Если интересует конкретное значение. 
    * Ключ может быть равным 'inetnum', 'country', 'city', 'region', 'district', 'lat', 'lng'
    * @param bolean - устанавливаем хранить данные в куки или нет
    * Если true, то в куки будут записаны данные по ip и повторные запросы на ipgeobase происходить не будут.
    * Если false, то данные постоянно будут запрашиваться с ipgeobase
    * @return array OR string - дополнительно читайте комментарии внутри функции.
    */

    
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 !empty(
$data[$key]) ? $data[$key] : 'Unknown'// если указан ключ, возвращаем строку с нужными данными
        
}
        else {

            return 
$data// иначе возвращаем массив со всеми данными            
        
}
    }

   
/**
    * функция получает данные по ip.
    * @return array - возвращает массив с данными
    */

    
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;
    }

   
/**
    * функция парсит полученные в XML данные в случае, если на сервере не установлено расширение Simplexml
    * @return array - возвращает массив с данными
    */

    
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;
    }

   
/**
    * функция определяет ip адрес по глобальному массиву $_SERVER
    * ip адреса проверяются начиная с приоритетного, для определения возможного использования прокси
    * @return ip-адрес
    */

    
public 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'];

        foreach(
$ipa as $ips) { // проверяем ip-адреса на валидность начиная с приоритетного.

            
if ($this->is_valid_ip($ips)) { //  если ip валидный обрываем цикл, назначаем ip адрес и возвращаем его
                    
                
$ip $ips;
                break;
            }
        }
        return 
$ip;
    }

   
/**
    * функция для проверки валидности ip адреса
    * @param ip адрес в формате 1.2.3.4
    * @return bolean : true - если ip валидный, иначе false
    */

    
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
    
}

}

?>
Онлайн: 0
Реклама