php查询ip所在地代码

<?php教程
/**
*@ date         2010.12.21
*@ author       王刚
*@ email        373882774@qq.com
*@ qq           373882774
注:文件头 [第一条索引的偏移量 (4byte)] + [最后一条索引的偏移地址 (4byte)]     8字节
记录区 [结束ip (4byte)] + [地区1] + [地区2]                                4字节+不定长
索引区 [开始ip (4byte)] + [指向记录区的偏移地址 (3byte)]                   7字节
*/
class iplocation{
var $fp;
var $firstip;  //第一条ip索引的偏移地址
var $lastip;   //最后一条ip索引的偏移地址
var $totalip;  //总ip数
/*
|----------------------------------------------------------------------------
| 构造函数,初始化一些变量
|----------------------------------------------------------------------------
|
*/
function iplocation($datfile = "qqwry.dat"){
$this->fp=fopen($datfile,'rb')or die("qqwry.dat不存在,请去网上 <a href='http://www.heqee.com/apps教程/download/iplocationapi.rar'>下载纯真ip数据 库</a>, 'qqwry.dat' 放到当前目录下");   //二制方式打开
$this->firstip = $this->get4b(); //第一条ip索引的绝对偏移地址
$this->lastip = $this->get4b();  //最后一条ip索引的绝对偏移地址
$this->totalip =($this->lastip - $this->firstip)/7 ; //ip总数 索引区是定长的7个字节,在此要除以7,
register_shutdown_function(array($this,"closefp"));  //为了兼容php5以下版本,本类没有用析构函数,自动关闭ip库.
}
/*
|----------------------------------------------------------------------------
| 关闭ip库
|----------------------------------------------------------------------------
|
*/
function closefp(){
fclose($this->fp);
}
/*
|----------------------------------------------------------------------------
| 读取4个字节并将解压成long的长模式
|----------------------------------------------------------------------------
|
*/
function get4b(){
$str=unpack("v",fread($this->fp,4));
return $str[1];
}
/*
|----------------------------------------------------------------------------
| 读取重定向了的偏移地址
|----------------------------------------------------------------------------
|
*/
function getoffset(){
$str=unpack("v",fread($this->fp,3).chr(0));
return $str[1];
}
/*
|----------------------------------------------------------------------------
| 读取ip的详细地址信息
|----------------------------------------------------------------------------
|
*/
function getstr(){
$split=fread($this->fp,1);
while (ord($split)!=0) {
$str .=$split;
$split=fread($this->fp,1);
}
return $str;
}
/*
|----------------------------------------------------------------------------
| 将ip通过ip2long转成ipv4的互联网地址,再将他压缩成big-endian字节序 ,用来和索引区内的ip地址做比较
|----------------------------------------------------------------------------
|
*/
function iptoint($ip){
return pack("n",intval(ip2long($ip)));
}
/*
|----------------------------------------------------------------------------
| 获取地址信息
|----------------------------------------------------------------------------
|
*/
function readaddress(){
$now_offset=ftell($this->fp); //得到当前的指针位址
$flag=$this->getflag();
switch (ord($flag)){
case 0:
$address="";
break;
case 1:
case 2:
fseek($this->fp,$this->getoffset());
$address=$this->getstr();
break;
default:
fseek($this->fp,$now_offset);
$address=$this->getstr();
break;
}
return $address;
}
/*
|----------------------------------------------------------------------------
| 获取标志1或2   用来确定地址是否重定向了
|----------------------------------------------------------------------------
|
*/
function getflag(){
return fread($this->fp,1);
}
/*
|----------------------------------------------------------------------------
| 用二分查找法在索引区内搜索ip
|----------------------------------------------------------------------------
|
*/
function searchip($ip){
$ip=gethostbyname($ip);     //将域名转成ip
$ip_offset["ip"]=$ip;
$ip=$this->iptoint($ip);    //将ip转换成长整型
$firstip=0;                 //搜索的上边界
$lastip=$this->totalip;     //搜索的下边界
$ipoffset=$this->lastip;    //初始化为最后一条ip地址的偏移地址
while ($firstip <= $lastip){
$i=floor(($firstip + $lastip) / 2);          //计算近似中间记录 floor函数记算给定浮点数小的最大整数,说白了就是四舍五也舍
fseek($this->fp,$this->firstip + $i * 7);    //定位指针到中间记录
$startip=strrev(fread($this->fp,4));         //读取当前索引区内的开始ip地址,并将其little-endian的字节序转换成big-endian的字节序
if ($ip < $startip) {
$lastip=$i - 1;
}
else {
fseek($this->fp,$this->getoffset());
$endip=strrev(fread($this->fp,4));
if ($ip > $endip){
$firstip=$i + 1;
}
else {
$ip_offset["offset"]=$this->firstip + $i * 7;
break;
}
}
}
return $ip_offset;
}
/*
|----------------------------------------------------------------------------
| 获取ip地址详细信息
|----------------------------------------------------------------------------
|
*/
function getaddress($ip){
$ip_offset=$this->searchip($ip);  //获取ip 在索引区内的绝对编移地址
$ipoffset=$ip_offset["offset"];
$address["ip"]=$ip_offset["ip"];
fseek($this->fp,$ipoffset);      //定位到索引区
$address["startip"]=long2ip($this->get4b()); //索引区内的开始ip 地址
$address_offset=$this->getoffset();            //获取索引区内ip在ip记录区内的偏移地址
fseek($this->fp,$address_offset);            //定位到记录区内
$address["endip"]=long2ip($this->get4b());   //记录区内的结束ip 地址
$flag=$this->getflag();                      //读取标志字节
switch (ord($flag)) {
case 1:  //地区1地区2都重定向
$address_offset=$this->getoffset();   //读取重定向地址
fseek($this->fp,$address_offset);     //定位指针到重定向的地址
$flag=$this->getflag();               //读取标志字节
switch (ord($flag)) {
case 2:  //地区1又一次重定向,
fseek($this->fp,$this->getoffset());
$address["area1"]=$this->getstr();
fseek($this->fp,$address_offset+4);      //跳4个字节
$address["area2"]=$this->readaddress();  //地区2有可能重定向,有可能没有
break;
default: //地区1,地区2都没有重定向
fseek($this->fp,$address_offset);        //定位指针到重定向的地址
$address["area1"]=$this->getstr();
$address["area2"]=$this->readaddress();
break;
}
break;
case 2: //地区1重定向 地区2没有重定向
$address1_offset=$this->getoffset();   //读取重定向地址
fseek($this->fp,$address1_offset); 
$address["area1"]=$this->getstr();
fseek($this->fp,$address_offset+8);
$address["area2"]=$this->readaddress();
break;
default: //地区1地区2都没有重定向
fseek($this->fp,$address_offset+4);
$address["area1"]=$this->getstr();
$address["area2"]=$this->readaddress();
break;
}
//*过滤一些无用数据
if (strpos($address["area1"],"cz88.net")!=false){
$address["area1"]="未知";
}
if (strpos($address["area2"],"cz88.net")!=false){
$address["area2"]=" ";
}
return $address;
}
}

 

/*用法如下:*/
$ip=new iplocation("qqwry.dat");
$address=$ip->getaddress("221.231.102.100");
//$address=$ip->getaddress(www.111cn.net);
echo '<pre>';
print_r($address);
?>

时间: 2024-11-27 17:18:33

php查询ip所在地代码的相关文章

php查询ip所在地的方法_php技巧

本文实例讲述了php查询ip所在地的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: <?php /** *@ date         2010.12.21 注:文件头 [第一条索引的偏移量 (4byte)] + [最后一条索引的偏移地址 (4byte)]     8字节 记录区 [结束ip (4byte)] + [地区1] + [地区2]                                4字节+不定长 索引区 [开始ip (4byte)] + [指向记录区

PHP查询ip所在地的几种方法(api实例)

例子,利用第三方接口实例  代码如下 复制代码 <form action=www.111cn.net method="post">  <p>请输入ip地址:<input type="text" name="ip" /></p>  <p><input type="submit" value="查询"  /></p> </

PHP查询ip所在地(省份,市)

今天分享一个PHP根据客户端IP地址获得所属地的小程序,以前写的,已经用了很久了,感觉这个接口还是停稳定的.虽然现在网上也有很多类似的,但是我觉得我这个还是很不错的,核心代码只用3行就能实现.虽然功能不是很强大,但是我们平时算是够用的.以下是代码:    代码如下 复制代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xht

php查询ip所在地的方法

 具体实现方法如下:   代码如下: <?php /** *@ date         2010.12.21 注:文件头 [第一条索引的偏移量 (4byte)] + [最后一条索引的偏移地址 (4byte)]     8字节 记录区 [结束ip (4byte)] + [地区1] + [地区2]                                4字节+不定长 索引区 [开始ip (4byte)] + [指向记录区的偏移地址 (3byte)]                   7字

win7用查询ip命令代码

  这里有几种方法推荐大家 方法一:在百度搜索"IP"便会直接得出电脑外网的IP地址.   方法二:打开开始菜单,在搜索框内输入"cmd"-在弹出的黑框中输入"ipconfig"回车即可看到自己的ip地址.   方法三:电脑任务栏中打开"网络和共享中心"-"无线网络连接"-然后点击"详细信息"就可以看到电脑详细的ip地址了.   方法四:使用IP查询器搜索 输入IP地址或网址查询地理地址

PHP一些可以查询IP地理位置、身份证所在地、手机归属地的接口

  一些可以查询IP地理位置.身份证所在地.手机归属地的接口. 由于某些接口需要提供来路,所以以下代码如果JS不能直接读取,可以通过PHP来返回结果,然后再通过JS调用返回结果的页面.   源码与演示:源码出处 演示出处   01 <?php 02 /* 03 新浪的IP查询接口: 04 新浪的:http://counter.sina.com.cn/ip?ip=IP地址 05 返回Js数据,感觉不是很精确,可以把问号后面的去掉,直接返回本机对应的IP所在地 06   07 有道的IP查询接口:

ASP程序编写完整的一个IP所在地搜索类

程序  修正了查询方法,查询的方法和追捕的一致:只是追捕会自动更正IP.   还有个函数的书写错误,也已经修正:   包括增加了一个IP地址正确性的验证函数.(只是从格式上判断)   <%   '作者:萧寒雪(S.F.)   'QQ号:410000   Server.ScriptTimeout = &HE10 '&H3C   Response.Buffer = ("S.F." = "S.F.")   Dim IpSearch   '建立对象  

ASP编写完整的一个IP所在地搜索类

ASP编写完整的一个IP所在地搜索类的修正文稿 修正了查询方法,查询的方法和追捕的一致:只是追捕会自动更正IP. 还有个函数的书写错误,也已经修正: 包括增加了一个IP地址正确性的验证函数.(只是从格式上判断) <% Server.ScriptTimeout = &HE10 '&H3C Response.Buffer = ("S.F." = "S.F.") Dim IpSearch '建立对象 Set IpSearch = New clsIpS

ASP编写完整的一个IP所在地搜索类(修正)

修正了查询方法,查询的方法和追捕的一致:只是追捕会自动更正IP. 还有个函数的书写错误,也已经修正: 包括增加了一个IP地址正确性的验证函数.(只是从格式上判断) <% '作者:萧寒雪(S.F.) 'QQ号:410000Server.ScriptTimeout = &HE10 '&H3CResponse.Buffer = ("S.F." = "S.F.")Dim IpSearch'建立对象Set IpSearch = New clsIpSear