PHP判断IP并转跳到相应城市分站的方法_php技巧

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

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

实例演示如下:

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 判断
, ip
, 方法
, 分站
, 转跳
相应城市
易语言 判断 未相应、电路故障判断技巧、车距判断技巧图解、驾车技巧判断距离、suv车距判断技巧图解,以便于您获取更多的相关知识。

时间: 2024-08-31 15:45:56

PHP判断IP并转跳到相应城市分站的方法_php技巧的相关文章

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

 这篇文章主要介绍了PHP判断IP并转跳到相应城市分站的方法,实例分析了php解析URL及跳转的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP判断IP并转跳到相应城市分站的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

PHP简单判断iPhone、iPad、Android及PC设备的方法_php技巧

本文实例讲述了PHP简单判断iPhone.iPad.Android及PC设备的方法.分享给大家供大家参考,具体如下: 因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段PHP判断iPhone.iPad.Android.PC设备的例子. 我将使用Windows系统的设备定为PC,毕竟博客面向中国用户,大部分家用设备还是用的Windows系统. 原理是判断浏览器提交的USER AGENT,代码如下: <?php //获取USER AGENT

php判断两个日期之间相差多少个月份的方法_php技巧

本文实例讲述了php判断两个日期之间相差多少个月份的方法.分享给大家供大家参考.具体实现方法如下: /** * @author injection(injection.mail@gmail.com) * @var date1日期1 * @var date2 日期2 * @var tags 年月日之间的分隔符标记,默认为'-' * @return 相差的月份数量 * @example: $date1 = "2003-08-11"; $date2 = "2008-11-06&qu

在php中判断一个请求是ajax请求还是普通请求的方法_php技巧

/path/to/pkphp.com/script.php?ajax 在php脚本中使用如下方法判断: 复制代码 代码如下: if(isset($_GET['ajax'])) { ...这是一个ajax请求,然后... } else { ...这不是一个ajax请求,然后... } 通过传递_GET参数的方法简单实现了网页请求的判断.但是如果需要这样的功能,这个方法可能就有弊端,功能需求如下: 1.通过ajax请求的网页与普通请求的网页内容是不相同的 2.通过ajax请求的网页是为了方便用户操作

探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法_php技巧

[造成原因]:Because PHP's integer type is signed, and many IP addresses will result in negative integers.[解决办法]:其官方手册中提到,可以"you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned IP address&q

PHP页面跳转操作实例分析(header方法)_php技巧

本文实例分析了PHP页面跳转操作.分享给大家供大家参考,具体如下: 跳转 header()为php函数,向浏览器发送指定命令 html: <meta http-equiv="Refresh" content="3;url=other.php"/> 立即跳转: header('Location:other.php'); //file_put_contents('bee.txt','execute'); die; 执行header时候,并不是立即结束,而是会

thinkphp判断访客为手机端或PC端的方法_php实例

本文实例讲述了thinkphp判断访客为手机端或PC端的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 近日准备给自己的网站做一个小升级,让用户在手机二维码扫描的时候显示适合手机端来展示的模版[我用的是ThinkPHP3.0],代码是参考别人的 二.实现方法: 这里先说下大概的一个思路 简单两步: 统版本号和浏览器以及它的版本号(贴出的代码中数组中只有移动端信息,因此后面只需判断是否为数组中的某一个值即可). 根据数组中的值来判断访客是否为手机.pad.之类的移动端,如果是的话就规定

javascript判断并获取注册表中可信任站点的方法_javascript技巧

本文实例讲述了javascript判断并获取注册表中可信任站点的方法.分享给大家供大家参考.具体分析如下: 判断可信任站点,首先要在注册表中找到可信任站点在注册表中的位置,如下: (1)域名作为可信任站点在注册表中的位置:  HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\InternetSettings\\ZoneMap\\Domains\\ (2)IP作为可信任站点在注册表中的位置:  HKCU\\Software\\Microsoft

js判断移动端是否安装某款app的多种方法_javascript技巧

本文实例讲解了js判断移动端是否安装某款app的多种方法,分享给大家供大家参考,具体内容如下 第一种方法: 一:判断是那种设备 var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 二:安卓设备:原理:判断是否认识这个协议,认识则直接跳转,不认识