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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • php实现多城市切换特效

    我们先来看下个人常用的代码 PHP <?php include_once('./qqwry.php'); $QQWry=new QQWry; function get_real_ip(){ $ip=false; if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $ip = $_SERVER["HTTP_CLIENT_IP"]; } if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $i

  • PHP中根据IP地址判断城市实现城市切换或跳转代码

    获取IP地址 复制代码 代码如下: <?phpfunction GetIP() {    if ($_SERVER["HTTP_X_FORWARDED_FOR"])        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];    else if ($_SERVER["HTTP_CLIENT_IP"])        $ip = $_SERVER["HTTP_CLIENT_IP"];  

  • PHP根据IP地址获取所在城市具体实现

    文件目录: ipLocation-----qqwry----------QQWry.Dat-----ipCity.class.php ipCity.class.php文件代码: 复制代码 代码如下: <?php class ipCity { /**     * 根据ip地址获取对应所在城市     * @param type $userip 用户IP地址     * @return string     */    public function getCity( $userip, $dat_p

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

    本文实例讲述了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

  • react-navigation 如何判断用户是否登录跳转到登录页的方法

    本文介绍了react-navigation 如何判断用户是否登录跳转到登录页的方法,分享给大家,也给自己留个笔记,具体如下: 新建一个index.js import React, {Component} from 'react'; import {AppRegistry, Text, View, Button,Image,StyleSheet,BackHandler,ToastAndroid} from 'react-native'; import { StackNavigator,TabNav

  • Vue-router路由判断页面未登录跳转到登录页面的实例

    如下所示: router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requireAuth)){ // 判断该路由是否需要登录权限 if (token) { // 判断当前的token是否存在 next(); } else { next({ path: '/login', query: {redirect: to.fullPath} // 将跳转的路由path作为参数,登录成功后跳转到该

  • Java判断IP地址为内网IP还是公网IP的方法

    本文实例讲述了Java判断IP地址为内网IP还是公网IP的方法.分享给大家供大家参考.具体分析如下: tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255 172.16.0.0/12:172.16.0.0-172.31.255.255 192.168.0.0/16:192.168.0.0-192.168.255.255 那么,直接上代码吧: 复制代码 代码如下: public static boolea

  • Android 判断ip地址合法实现代码

    Android 判断ip地址合法实现代码 昨天,我在网上找了一下判断文本框内的字符串是否是合法的ip地址,自己想到了正则表达式,可是自己对这个却不熟,所以在网上查找了一些资料,最后终于是做出来了. 具体的代码很简单, public boolean isIP(String addr) { if(addr.length() < 7 || addr.length() > 15 || "".equals(addr)) { return false; } /** * 判断IP格式和范

  • app判断链接参数后缀跳转不同地址的方法

    实例如下所示: http://testhf.irongbei.com/DoubleAct/index?from=app <?php $urlp = (isset($_GET['from']) && $_GET['from'] == 'app') ? '/AppStatics/noToT#plist':'/MIndex/plist';?> <p style="font-size:13px;display:none;" id='t_invest'>&

  • 两款JS脚本判断手机浏览器类型跳转WAP手机网站

    随着移动设备的普及,企业的网络宣传已经不能局限在PC端,而需要同时在移动端有所建树.对于公司网站来说,以前都是做的PC端的,当然手机等移动端也可以访问,但是用户体验肯定不如完全适合的手机端来的方便.我们在给自己的网站做了WAP手机网站之后,如果有用户通过手机访问我们的企业顶级域名网站,那就判断跳转到专为的WAP网站. 这里老左整理到目前自己在使用的2种JS脚本,因为之前一直有朋友跟我要,所以这里分享出来. 第一种:直接JS脚本 <script type="text/javascript&q

  • Java 判断IP地址的合法性实例详解

    Java 判断IP地址的合法性 0.前言 有时候我们要对用户输入的IP地址进行校验,判断这个IP地址是不是一个合法的IP地址. 1.实现思路 最简单的实现方法是构造一个正则表达式.判断用户的输入与正则表达式是否匹配.若匹配则是正确的IP地址,否则不是正确的IP地址.这里的难点是如何构造出一个可用的正则表达式. 2.Java实现 /** * Created by HUPENG on 2016/9/26. */ public class Tool { /** * 判断IP地址的合法性,这里采用了正则

  • python 实现判断ip连通性的方法总结

    python 以下是个人学习 python 研究判断ip连通性方法的集合. 缺点可能有办法解决,如有错误,欢迎矫正. 方法一 import os return1=os.system('ping -n 2 -w 1 172.21.1.183') print return1 缺点:会弹出cmd 窗口 方法二 #-*- coding: utf-8 -*- import subprocess import re p = subprocess.Popen(["ping.exe ", '172.2

  • java正则表达式判断 ip 地址是否正确解析

    这篇文章主要介绍了java正则表达式判断 ip 地址是否正确解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 public class ClassWork05 { public static void main(String[] args) { System.out.println(IsIp.isIp("10.10.1.1")); } } class IsIp{ public static boolean isIp(Str

随机推荐