PHP 判断IP并转跳到相应城市分站功能实例

内容摘要
这篇文章主要为大家详细介绍了PHP 判断IP并转跳到相应城市分站功能实例,具有一定的参考价值,可以用来参考一下。

对PHP判断IP并转跳到相应城市分站的代码演示对此感兴趣的朋
文章正文

这篇文章主要为大家详细介绍了PHP 判断IP并转跳到相应城市分站功能实例,具有一定的参考价值,可以用来参考一下。

对PHP判断IP并转跳到相应城市分站的代码演示对此感兴趣的朋友,看看idc笔记做的技术笔记!

/**
 * 判断IP并转跳到相应城市分站的代码演示
 *
 * @param 
 * @arrange 五一二笔记网: www.512Pic.com
 **/  
class QQWry{    
	var $StartIP=0;    
	var $EndIP=0;    
	var $Country='';    
	var $Local='';    
	var $CountryFlag=0; // 标识 Country位置    
			 // 0x01,随后3字节为Country偏移,没有Local    
			 // 0x02,随后3字节为Country偏移,接着是Local    
			 // 其他,Country,Local,Local有类似的压缩。可能多重引用。    
	var $fp;    
	var $FirstStartIp=0;    
	var $LastStartIp=0;    
	var $EndIpOff=0 ;    
	function getStartIp($RecNo){    
	 $offset=$this->FirstStartIp+$RecNo * 7 ;    
	 @fseek($this->fp,$offset,SEEK_SET) ;    
	 $buf=fread($this->fp ,7) ;    
	 $this->EndIpOff=ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])* 256*256);    
	 $this->StartIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);    
	 return $this->StartIp;    
	}    
	function getEndIp(){    
	 @fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ;    
	 $buf=fread ( $this->fp , 5 ) ;    
	 $this->EndIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);    
	 $this->CountryFlag=ord ( $buf[4] ) ;    
	 return $this->EndIp ;    
	}    
	function getCountry(){    
	 switch ( $this->CountryFlag ) {    
		case 1:    
		case 2:    
		 $this->Country=$this->getFlagStr ( $this->EndIpOff+4) ;    
		 //echo sprintf('EndIpOffset=(%x)',$this->EndIpOff );    
		 $this->Local=( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff+8);    
		 break ;    
		default :    
		 $this->Country=$this->getFlagStr ($this->EndIpOff+4);    
		 $this->Local=$this->getFlagStr ( ftell ( $this->fp ));    
	 }    
	}    
	function getFlagStr ($offset){    
	 $flag=0 ;    
	 while(1){    
		@fseek($this->fp ,$offset,SEEK_SET) ;    
		$flag=ord(fgetc($this->fp ) ) ;    
		if ( $flag == 1 || $flag == 2 ) {    
		 $buf=fread ($this->fp , 3 ) ;    
		 if ($flag==2){    
			$this->CountryFlag=2;    
			$this->EndIpOff=$offset - 4 ;    
		 }    
		 $offset=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256);    
		}    
		else{    
		 break ;    
		}    
	 }    
	 if($offset<12)    
		return '';    
	 @fseek($this->fp , $offset , SEEK_SET ) ;    
	 return $this->getStr();    
	}    
	function getStr ( )    
	{    
	 $str='' ;    
	 while ( 1 ) {    
		$c=fgetc ( $this->fp ) ;    
		//echo "$cn" ;    
		if(ord($c[0])== 0 )    
		 break ;    
		$str.= $c ;    
	 }    
	 //echo "$str n";    
	 return $str ;    
	}    
	function qqwry ($dotip='') {    
		if( !is_string($dotip) || $dotip==''){return;}    
		if(preg_match("/^127/",$dotip)){$this->Country="本地网络";return ;}    
		elseif(preg_match("/^192/",$dotip)) {$this->Country="局域网";return ;}    
	 $nRet;    
	 $ip=$this->IpToInt ( $dotip );    
	 $this->fp= fopen(__QQWRY__, "rb");    
	 if ($this->fp == NULL) {    
		 $szLocal= "OpenFileError";    
		return 1;    
	 }    
	 @fseek ( $this->fp , 0 , SEEK_SET ) ;    
	 $buf=fread ( $this->fp , 8 ) ;    
	 $this->FirstStartIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);    
	 $this->LastStartIp=ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256);    
	 $RecordCount= floor( ( $this->LastStartIp - $this->FirstStartIp ) / 7);    
	 if ($RecordCount <= 1){    
		$this->Country="FileDataError";    
		fclose($this->fp) ;    
		return 2 ;    
	 }    
	 $RangB= 0;    
	 $RangE= $RecordCount;    
	 // Match ...    
	 while ($RangB < $RangE-1)    
	 {    
	 $RecNo= floor(($RangB + $RangE) / 2);    
	 $this->getStartIp ( $RecNo ) ;    
		if ( $ip == $this->StartIp )    
		{    
		 $RangB=$RecNo ;    
		 break ;    
		}    
	 if ($ip>$this->StartIp)    
		$RangB= $RecNo;    
	 else   
		$RangE= $RecNo;    
	 }    
	 $this->getStartIp ( $RangB ) ;    
	 $this->getEndIp ( ) ;    
	 if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){    
		$nRet=0 ;    
		$this->getCountry ( ) ;    
		//这样不太好..............所以..........    
		$this->Local=str_replace("(我们一定要解放台湾!!!)", "", $this->Local);    
	 }    
	 else{    
		$nRet=3 ;    
		$this->Country='未知' ;    
		$this->Local='' ;    
	 }    
	 fclose ( $this->fp );    
$this->Country=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Country);    
$this->Local=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Local);    
//////////////看看 $nRet在上面的值是什么0和3,于是将下面的行注释掉    
		return $nRet ;    
	 //return "$this->Country $this->Local";#如此直接返回位置和国家便可以了    
	}    
	function IpToInt($Ip) {    
	 $array=explode('.',$Ip);    
	 $Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];    
	 return $Int;    
	}    
 }    
/*实例演示   
$QQWry=new QQWry;   
$QQWry->QQWry("60.31.95.255");   
$country = $QQWry->Country;   
echo $QQWry->Country.",".$QQWry->Local;   
*/   

/***   来自php教程(www.idcnote.com)   ***/

注:关于PHP 判断IP并转跳到相应城市分站功能实例的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!