php判断ip跳转城市,PHP判断IP并转跳到相应城市分站的方法

本文实例讲述了PHP判断IP并转跳到相应城市分站的方法。分享给大家供大家参考。具体实现方法如下:

?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144<?php   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("area error", "",$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;    }   }  ?>

实例演示如下:

?1234$QQWry=new QQWry;$QQWry->QQWry("60.31.95.255");$country = $QQWry->Country;echo $QQWry->Country.",".$QQWry->Local;

希望本文所述对大家的php程序设计有所帮助。

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值