PHP Classes
Icontem

File: geoip.php


  Search   All class groups All class groups   Latest entries Latest entries   Top 10 charts Top 10 charts   Newsletter Newsletter   Blog Blog   Forums Forums   Help FAQ Help FAQ  
  Login   Register  
Recommend this page to a friend! ReTweet ReTweet Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Marius Zadara  >  GeoIP Country Whois Locator  >  geoip.php  
File: geoip.php
Role: Class source
Content type: text/plain
Description: GeoIP PHP source class
Class: GeoIP Country Whois Locator
Determine the country of an IP address using GeoIP
 

Contents

Class file image Download
<?php

/**
* GeoIPCountryWhois Locator
*
* This file locates the remote's country using it's IP, parsed in a CSV values
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt.  If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category   Localization
* @package    geoip
* @author     Marius Zadara <marius_victor@yahoo.com>
* @copyright  (C) Marius Zadara <marius_victor@yahoo.com>
* @license    http://www.php.net/license/3_0.txt  PHP License 3.0
* @version    1.0
* @since      File available since Release 1.0
*/



class GeoIP
{
    var 
$_path;


    
/**
    * Boolean found
    *
    * @since 1.0
    * @var boolean
    */
    
var $_found            false;

    
/**
    * Starting address of the class
    *
    * @return void
    * @var boolean
    */
    
var $_start_ip         false;

    
/**
    * Ending address of the class
    *
    * @return void
    * @var boolean
    */
    
var $_end_ip         false;

    
/**
    * Country code
    *
    * @return void
    * @var boolean
    */
    
var $_country_code     false;

    
/**
    * Country name
    *
    * @return void
    * @var boolean
    */
    
var $_country_name     false;

    
/**
    * CSV values
    *
    * @return void
    * @var boolean
    */
    
var $_data            = array();

    
/**
    * Long representation of the IP
    *
    * @return void
    * @var boolean
    */
    
var $_longip        0;

    
/**
    * Class constructor
    *
    * @return void
    * @access public
    * @static
    * @since 1.0
    */
    
function GeoIP()
    {
        
$filename "GeoIPCountryWhois.gz";
        
$this->_data gzfile($filename);
    }

    
/**
    * IP address conversion: A.B.C.D -> log
    *
    * @param string $string IP Address: A.B.C.D
    * @return long
    * @access private
    * @static
    * @since 1.0
    */
    
private function convert2number($string)
    {
        
$pattern"\"([0-9]+)\"";
        if (
ereg($pattern$string$regs))
            return (int)
$regs[1];
    }

    
/**
    * IP searching
    *
    * @param string $beg Starting index
    * @param string $end Ending index
    * @return long/bool
    * @access private
    * @static
    * @since 1.0
    */
    
private function search($beg$end)
    {
        
/**
        This is the main search functions.

        It uses the DIVIDE-ET-IMPERA paradigm to find the specified IP in the data array.
        Each data in the array looks like:
            "IP_1","IP_2","LONG_IP_1","LONG_IP_2","COUNTRY_CODE","COUNTRY_NAME"

        IP is belonging to COUNTRY_NAME if complies with the formula:
            LONG_IP_1 <= LONG_IP <= LONG_IP_2

        The function returns either:
            - the pozition in the array IF FOUND
            - false, IF NOT FOUND
        */

        
$mid ceil(($end $beg) / 2);


        
$arr_beg = array();
        
$arr_mid = array();
        
$arr_end = array();

        
$arr_beg explode(","$this->_data[$beg]);
        
$arr_mid explode(","$this->_data[$mid]);
        
$arr_end explode(","$this->_data[$end]);


        
$arr_beg[2] = str_replace('"'''$arr_beg[2]);
        
$arr_beg[3] = str_replace('"'''$arr_beg[3]);

        
$arr_mid[2] = str_replace('"'''$arr_mid[2]);
        
$arr_mid[3] = str_replace('"'''$arr_mid[3]);

        
$arr_end[2] = str_replace('"'''$arr_end[2]);
        
$arr_end[3] = str_replace('"'''$arr_end[3]);




        if ((
$this->_longip >= $arr_beg[2]) && ($this->_longip <= $arr_beg[3]))
        {
            unset(
$arr_beg); unset($arr_mid); unset($arr_end);
            return 
$beg;
        }
        else
            if ((
$this->_longip >= $arr_mid[2]) && ($this->_longip <= $arr_mid[3]))
            {
                unset(
$arr_beg); unset($arr_mid); unset($arr_end);
                return 
$mid;
            }
            else
                if ((
$this->_longip >= $arr_end[2]) && ($this->_longip <= $arr_end[3]))
                {
                    unset(
$arr_beg); unset($arr_mid); unset($arr_end);
                    return 
$end;

                }
                else
                    if ((
$this->_longip $arr_beg[3]) && ($this->_longip $arr_mid[2]))
                    {
                        unset(
$arr_beg); unset($arr_mid); unset($arr_end);
                        return 
$this->search($beg$mid);
                    }
                    else
                        if ((
$this->_longip $arr_mid[3]) && ($this->_longip $arr_end[2]))
                        {
                            unset(
$arr_beg); unset($arr_mid); unset($arr_end);
                            return 
$this->search($mid$end);
                        }
                        else
                        {
                            unset(
$arr_beg); unset($arr_mid); unset($arr_end);
                            return 
false;
                        }
    }


    
/**
    * IP conversion
    *
    * @param string $address IP address in the A.B.C.D format
    * @return long
    * @access private
    * @static
    * @since 1.0
    */
    
private function IpAddress2IpNumber($address)
    {
        
$pattern "([0-9]+).([0-9]+).([0-9]+).([0-9]+)";

        if (
ereg($pattern$address$regs))
            return 
$number $regs[1] * 256 256 256 $regs[2] * 256 256 $regs[3] * 256 $regs[4];
        else
            return 
false;
    }


    
/**
    * MAIN SEARCH
    *
    * @param string $ip The IP Searched
    * @return void
    * @access private
    * @static
    * @since 1.0
    */
    
public function search_ip($ip)
    {
        
// if not localhost ...
        
if (($ip != "127.0.0.1") && ($ip != "0.0.0.1"))
        {
            
$this->_longip $this->IpAddress2IpNumber($ip);

            if (
$this->_longip !== false)
                
$poz $this->search(0sizeof($this->_data)-1);

            if (
$poz !== false)
            {
                
$info explode(","$this->_data[$poz]);

                
$this->_found            true;
                
$this->_start_ip         str_replace('"'''$info[0]);
                
$this->_end_ip             str_replace('"'''$info[1]);
                
$this->_country_code     str_replace('"'''$info[4]);
                
$this->_country_name     str_replace('"'''$info[5]);
            }
        }
    }

    
/**
    * IP Class start
    *
    * @return string
    * @access public
    * @static
    * @since 1.0
    */
    
public function getStartIp()        {return $this->_start_ip;}

    
/**
    * IP Class end
    *
    * @return string
    * @access public
    * @static
    * @since 1.0
    */
    
public function getEndIp()            {return $this->_end_ip;}

    
/**
    * IP Country Code
    *
    * @return string
    * @access public
    * @static
    * @since 1.0
    */

    
public function getCountryCode()    {return $this->_country_code;}

    
/**
    * IP Country name
    *
    * @return string
    * @access public
    * @static
    * @since 1.0
    */
    
public function getCountryName()    {return $this->_country_name;}

    
/**
    * IP Found flag
    *
    * @return boolean
    * @access public
    * @static
    * @since 1.0
    */
    
public function found()                {return $this->_found;}


    
/**
    * Class unset
    *
    * @return void
    * @access public
    * @static
    * @since 1.0
    */
    
public function destroy()
    {
        unset(
$this->_found);
        unset(
$this->_start_ip);
        unset(
$this->_end_ip);
        unset(
$this->_country_code);
        unset(
$this->_country_name);
        unset(
$this->_data);
        unset(
$this);
    }
}


?>



 
  Advertise on this site Advertise on this site   Site map Site map   Statistics Statistics   Site tips Site tips   Privacy policy Privacy policy   Contact Contact  

For more information send a message to :
info at phpclasses dot org.
Copyright (c) Icontem 1999-2010 PHP Classes - PHP Class Scripts
  PHP Book Reviews - Reviews of books and other products