ThinkPHP使用UTFWry地址库开展IP定位实例,ThinkPHP使用纯真IP获取物理地址时中文乱码难点

后日在用ThinkPHP通过纯真IP获取地址时,发现输出结果汉语乱码,如图:

可以在官网的

放入ThinkPHP/Extend/Library/ORG/Net/(若是没有请手动创设)目录下边。

在WEB应用中,依据IP地址定位和笔录相关访问日志也是不行广泛的要求,在ThinkPHP中您可以轻松的贯彻IP地址获取和稳定。

因为依据IP找所在地是一个常规须要,ThinkPHP
也集成了那些工具,只但是要和谐上传IP地址库   
网上相比较盛行用稚嫩地址库,去下载一个,拷贝出QQWry.dat 出来即可

www.5929.com 1www.5929.com 2

一、获取IP地址

赢得扩大类库

能够在官网的www.5929.com,ThinkPHP使用UTFWry地址库开展IP定位实例,ThinkPHP使用纯真IP获取物理地址时中文乱码难点。
放入ThinkPHP/Extend/Library/ORG/Net/(假使没有请手动成立)目录上面。

据悉ThinkPHP的需求,默许情状下,我们要求将QQWry.Dat放入  
ThinkPHP/Extend/Library/ORG/Net
那一个目录下,当然假如说你早就把那些目录底下的IpLocation.class.php放在其余地点  
比如@ 那级目录,只需求使qqwrt在同级目录下即可

经查发现ThinkPHP的IpLocation.class.php类文件中表明:“由于使用UTF8编码
如若利用纯真IP地址库的话
须要对回到结果举行编码转换”,修改浏览器编码毕竟不是长久之计,

假使您不过需要取得用户访问的IP地址,那么直接利用系统内置的get_client_ip函数即可,该函数是ThinkPHP标准情势内置方法,可以直接选用,比PHP内置的种类变量$_SERVER[‘HTTP_CLIENT_IP’]持有更好的包容性,用法:

获取IP地址

比方您独自要求获得用户访问的IP地址,那么直接利用系统内置的get_client_ip函数即可,该函数是ThinkPHP标准情势内置方法,可以直接选择,比PHP内置的种类变量$_SERVER[‘HTTP_CLIENT_IP’]不无更好的包容性,用法:

  1. $ip = get_client_ip();

复制代码

get_client_ip援救IP地址的有余情况检测和合法性验证,再次来到值就是获取到的IP地址,假设获获得的IP地址不合法,将重临0.0.0.0。
假定要求,也足以回来IPV4地址数字,例如:

  1. $ip = get_client_ip(1);

复制代码

回到的结果也许接近于:

  1. 2130706433

复制代码

可用以地点范围和比较。

 

于是乎尝试通过定义一个数组编码转换方法,如图:

复制代码 代码如下:

IP地址定位

ThinkPHP使用UTFWry地址库开展IP定位实例,ThinkPHP使用纯真IP获取物理地址时中文乱码难点。单纯得到IP地址并不可能一心满意使用的急需,只好记录下来用于日后的日记分析必要,IP地址定位作用可以让您获得用户的所在区域。要选拔IP定位功用,除了须求IpLocation伸张类库之外,还索要IP地址库文件,由于ThinkPHP默许采取UTF8编码,由此最好是UTF8格式的IP地址库文件,如果是痴人说梦gbk编码的IP地址库文件,则要求对获取结果开展编码转换(上边会涉及),可以在那边下载UTF8编码的地方库文件:
解压后的地方库文件UTFWry.dat放入IpLocation伸张类库所在目录下边即可。
行使格局:

  1. import(‘ORG.Net.IpLocation’);// 导入IpLocation类
  2. $Ip = new IpLocation(); // 实例化类
  3. $location = $Ip->getlocation(‘218.79.93.194’); // 获取某个IP地址所在的岗位

复制代码

回来的location变量是一个数组,包含:

  1. $location[‘ip’] // IP地址
  2. $location[‘beginip’] // 用户IP所在范围的发端地址
  3. $location[‘endip’] // 用户IP所在范围的扫尾地址
  4. $location[‘country’] // 所在国家或者地面
  5. $location[‘area’] // 所在区域

复制代码

普普通通,大家要得到IP定位的话,只需求取country和area新闻:

  1. $info =  $location[‘country’].$location[‘area’];

复制代码

假定你利用的IP地址库文件不是UTFWry.dat(注目的在于Linux上边文件名的大小写也急需一致)的话,大家需求在实例化IpLocation类的时候传出地址库文件名,例如:

  1. $Ip = new IpLocation(‘MyIpWry.dat’); // 传入IP地址库文件名

复制代码

比方你的IP地址库是GBK编码的话,需求对回到结果进行编码转换。例如:

  1. $info = iconv(‘gbk’,’utf-8′,$location[‘country’].$location[‘area’]);

复制代码

设若调用getlocation方法的时候从不传来任何参数,系统会自动调用上边的get_client_ip函数获取当前所在IP地址:

  1. $location = $Ip->getlocation(); 

复制代码

也得以支持传入域名来自动获取ip地址

  1. import(‘ORG.Net.IpLocation’);// 导入IpLocation类
  2. $Ip = new IpLocation(); // 实例化类
  3. $area = $Ip->getlocation(‘www.thinkphp.cn’); // 获取域名服务器所在的岗位
  4.  dump($area);

复制代码

运行结果输出:
www.5929.com 3

假诺我们利用的是痴人说梦IP地址库,或者平常必要更换分化的地方库,为了便利IP定位的查询,也足以独立包装一个函数来获得地方音讯,参考那里:


而后由于qqwrt 是gbk 编码,thinkphp默许是utf-8 所以要求更换一下,送出代码

www.5929.com 4

$ip = get_client_ip();

 

这会儿修改getArea方法代码如下:

get_client_ip接济IP地址的有余动静检测和合法性验证,重临值就是得到到的IP地址,如若得到到的IP地址非法,将回到0.0.0.0。
若果急需,也足以重临IPV4地址数字,例如:

<?php  class IPLocationHelper{      static $IpLocation;                  public static function getUrlInfo($url){                    $ip = gethostbyname(self::fix($url));          return self::getIpInfo($ip);      }              private static function fix($url){          if(strpos($url,"http://")!==false){              $url = str_replace("http://","",$url);          }          if(strpos($url,"/")!==false){              $tmp= explode("/", $url);              $url = $tmp[0];          }          return $url;      }                public static function getIpInfo($ip){          import("ORG.Net.IpLocation");          if(empty(self::$IpLocation)){              self::$IpLocation = new IpLocation('qqwry.dat');          }          $infos=self::$IpLocation->getlocation($ip);          $infos['country'] = iconv('gbk','utf-8',$infos['country']);          $infos['area'] = iconv('gbk','utf-8',$infos['area']);            return $infos;      }  }

 

 

 

 

www.5929.com 5

复制代码 代码如下:

未来最后安插的时候自然要小心qqwrt.dat的大小写标题,本人最初在Windows下支付,顺遂解析出ip,可是一放到Linux
下就不行,最开头觉得是权力难题,最后发现,源代码中写的是QQWrt.dat 
文件则是qqwrt.dat   所以一直查不到,希望另外人别再犯那一个要旨错误

再一次运行难点一举成功:www.5929.com 6

$ip = get_client_ip(1);


回到的结果或者接近于:

复制代码 代码如下:

2130706433

可用来地点范围和相比较。

二、IP地址定位
仅仅收获IP地址并无法一心满意使用的需求,只可以记录下来用于日后的日记分析需求,IP地址定位成效可以让您拿走用户的所在区域。要动用IP定位成效,除了须求IpLocation扩张类库之外,还索要IP地址库文件,由于ThinkPHP默许接纳UTF8编码,因而最好是UTF8格式的IP地址库文件,若是是天真gbk编码的IP地址库文件,则必要对取得结果进行编码转换(上边会波及),可以在此处下载UTF8编码的地点库文件:

解压后的地方库文件UTFWry.dat放入IpLocation增添类库所在目录下边即可。
采纳方法:

复制代码 代码如下:

import(‘ORG.Net.IpLocation’);// 导入IpLocation类
$Ip = new IpLocation(); // 实例化类
$location = $Ip->getlocation(‘218.79.93.194’); //
获取某个IP地址所在的职分

回来的location变量是一个数组,包含:

复制代码 代码如下:

$location[‘ip’] // IP地址
$location[‘beginip’] // 用户IP所在范围的始发地址
$location[‘endip’] // 用户IP所在范围的竣事地址
$location[‘country’] // 所在国家或者所在
$location[‘area’] // 所在区域

一般,大家要得到IP定位的话,只需求取country和area新闻:

复制代码 代码如下:

$info =  $location[‘country’].$location[‘area’];

设若您拔取的IP地址库文件不是UTFWry.dat(注目的在于Linux上边文件名的深浅写也急需平等)的话,大家必要在实例化IpLocation类的时候传出地址库文件名,例如:

复制代码 代码如下:

$Ip = new IpLocation(‘MyIpWry.dat’); // 传入IP地址库文件名

倘诺您的IP地址库是GBK编码的话,须求对回到结果开展编码转换。例如:

复制代码 代码如下:

$info = iconv(‘gbk’,’utf-8′,$location[‘country’].$location[‘area’]);

一旦调用getlocation方法的时候从不传来任何参数,系统会活动调用上边的get_client_ip函数获取当前所在IP地址:

复制代码 代码如下:

$location = $Ip->getlocation();

也足以支持传入域名来自动获取ip地址

复制代码 代码如下:

import(‘ORG.Net.IpLocation’);// 导入IpLocation类
$Ip = new IpLocation(); // 实例化类
$area = $Ip->getlocation(‘www.thinkphp.cn’); //
获取域名服务器所在的岗位
dump($area);

运作结果输出:

www.5929.com 7

比方我们使用的是痴人说梦IP地址库,或者平常要求更换分裂的地址库,为了便于IP定位的查询,也可以独自包装一个函数来博取地方音信,参考那里:

您可能感兴趣的篇章:

  • ThinkPHP使用Smarty第三方插件方法小结
  • Thinkphp和onethink落成微信支付插件
  • 解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302荒谬的点子
  • ThinkPHP3.2.2的插件控制器功用
  • ThinkPHP上应用多说评论插件的格局
  • ThinkPHP3.2.2的插件控制器效能简述
  • thinkPHP简单调用函数与类库的章程
  • thinkphp跨库操作的简约代码实例
  • thinkPHP2.1自定义标签库的导入方法详解
  • ThinkPHP分组下自定义标签库实例
  • thinkPHP简单导入和行使阿里云OSSsdk的艺术

Leave a Comment.