PHP Classes

File: geoip.php

Recommend this page to a friend!
  Classes of Marius Zadara   GeoIP Country Whois Locator   geoip.php   Download  
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
Author: By
Last change:
Date: 16 years ago
Size: 6,713 bytes
 

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(0, sizeof($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);
    }
}


?>