php ip纯真数据库Dat,php查询IP地理位置(dat数据库)-纯真IP数据库
看到有人分享了一个,那就分享个经典的利用纯真IP数据库查询吧,相信有很多人都见过甚至用过了这个代码。不过可能不知道,这个代码其实是从一个PECL的C++代码改过来的。PHP代码/*++++++++++++++++++++++++++++++++++++
程序名称:IP解析程序
程序功能:基于QQ的二进制数据库QQWry.Dat
程序作者:strongc
使用方法:
请将文件 QQWry.Dat 置于当前目录中
或者可以用修改
define('__QQWRY__' , dirname(__FILE__).".\QQWry.Dat");
语句自定义QQWry.Dat路径
#实例+++++++++++++++++++++++++++++++
$ip="202.201.48.1";
$QQWry=new QQWry;
$ifErr=$QQWry->QQWry($ip);
echo "$QQWry->Country$QQWry->Local";
+++++++++++++++++++++++++++++++++++++*/
define('__QQWRY__' , dirname(__FILE__).".\QQWry.Dat");
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);
$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);
if(ord($c[0]) == 0) break;
$str .= $c;
}
return $str;
}
function QQwry($dotip = '')
{
if(!$dotip) return;
if(ereg("^(127)", $dotip))
{
$this->Country = '本地网络';
return;
}
else if(ereg("^(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 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 EndIp >= $ip))
{
$this->getCountry();
}
else
{
$this->Country = '未知';
$this->Local = '';
}
fclose($this->fp);
}
function IpToInt($Ip)
{
$array = explode('.', $Ip);
$Int = ($array[0] * 256 * 256 * 256) + ($array[1] * 256 * 256) + ($array[2] * 256) + $array[3];
return $Int;
}
}
2.[代码][PHP]代码$ip = "202.201.48.1";
$QQWry = new QQWry;
$ifErr = $QQWry->QQWry($ip);
echo $ip . "$QQWry->Country$QQWry->Local\n";
/*
结果:
202.201.48.1甘肃省兰州市西北师范大学
*/
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
php ip纯真数据库Dat,php查询IP地理位置(dat数据库)-纯真IP数据库相关推荐
- java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...
派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...
- oracle数据库怎么分组查询,oracle数据库之分组查询
本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1 多表查询2)而在 ...
- 查看oracle数据库启动状态,Oracle数据库的状态查询
1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; STARTED select open_mode from v$database ...
- MySQL数据库多表查询
MySQL数据库多表查询 前言 在之前的文章MySQL数据库之SQL入门中,我们讲到了四类SQL中的DQL(数据库查询语言,用于查询表中数据),但是我仅仅用DQL去查询一张表中数据,而在实际的应用中, ...
- SQL Server无法删除数据库 xxx,因为该数据库当前正在使用(如何删除一个Sql Server数据库)
1.一般情况下删除一个Sql Server数据库: 新建查询→输入"drop database xxx(xxx为数据库名)"→执行. 但有时会报错:无法删除数据库 "li ...
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)
前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)...
前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...
- C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】
前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...
- 最新IP数据库 存储优化 查询性能优化 每秒解析上千万
高性能IP数据库格式详解 每秒解析1000多万ip qqzeng-ip-ultimate.dat 3.0版 编码:UTF8 字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...
- sql 行政区划关联查询优化_最新IP数据库 存储优化 查询性能优化 每秒解析上千万...
高性能IP数据库格式详解 每秒解析1000多万ip qqzeng-ip-ultimate.dat 3.0版编码:UTF8字节序:Little-Endian 返回规范字段(如:亚洲|中国|香港|九龙| ...
最新文章
- 【转】:Andriod开发环境搭建 (1)
- 开源——需要分享共享的无私精神
- What type of NoSQL database is best suited to store hierarchical data?【转】
- 多种特征提取算法比较汇总
- java wordcount程序_WordCount程序(java)
- 【译】使用 Python 编写虚拟机解释器
- TP5.1查询用Db('不含表前缀')/Db::name('不含表前缀')/Db::table('含表前缀')返回数组;model()返回对象
- 【BIRT】使用rptlibrary设置统一数据源
- php怎么查自己的文件编码,php检测文件编码的方法示例
- C语言中sizeof和strlen的区别是什么
- maven学习(2)
- oc27--synthesize,省略getset实现
- mcinabox运行库下载_mcinabox下载-mcinabox运行库(附安装教程)最新官网版下载v0.1.3-1y2y游戏...
- 车牌识别系统论文python_车牌识别系统的设计与实现毕业论文
- 12个从小到超级成功的博客案例研究
- 混淆矩阵 matlab代码示例
- 构建高可用MYSQL主从复制集群
- 山东航天九通车联网:大数据技术引领为智慧物流赋能
- 面试笔记(51信用卡-Java开发实习)
- Three.js - 图形界面工具(lil-gui)(四)