看到有人分享了一个,那就分享个经典的利用纯真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数据库相关推荐

  1. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...

    派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...

  2. oracle数据库怎么分组查询,oracle数据库之分组查询

    本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1  多表查询2)而在 ...

  3. 查看oracle数据库启动状态,Oracle数据库的状态查询

    1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; STARTED select open_mode from v$database ...

  4. MySQL数据库多表查询

    MySQL数据库多表查询 前言 在之前的文章MySQL数据库之SQL入门中,我们讲到了四类SQL中的DQL(数据库查询语言,用于查询表中数据),但是我仅仅用DQL去查询一张表中数据,而在实际的应用中, ...

  5. SQL Server无法删除数据库 xxx,因为该数据库当前正在使用(如何删除一个Sql Server数据库)

    1.一般情况下删除一个Sql Server数据库: 新建查询→输入"drop database xxx(xxx为数据库名)"→执行. 但有时会报错:无法删除数据库 "li ...

  6. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)

    前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...

  7. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法(附IP库下载地址及相关dll下载)...

    前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...

  8. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】

    前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...

  9. 最新IP数据库 存储优化 查询性能优化 每秒解析上千万

    高性能IP数据库格式详解 每秒解析1000多万ip  qqzeng-ip-ultimate.dat 3.0版 编码:UTF8     字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...

  10. sql 行政区划关联查询优化_最新IP数据库 存储优化 查询性能优化 每秒解析上千万...

    高性能IP数据库格式详解 每秒解析1000多万ip  qqzeng-ip-ultimate.dat 3.0版编码:UTF8字节序:Little-Endian 返回规范字段(如:亚洲|中国|香港|九龙| ...

最新文章

  1. 【转】:Andriod开发环境搭建 (1)
  2. 开源——需要分享共享的无私精神
  3. What type of NoSQL database is best suited to store hierarchical data?【转】
  4. 多种特征提取算法比较汇总
  5. java wordcount程序_WordCount程序(java)
  6. 【译】使用 Python 编写虚拟机解释器
  7. TP5.1查询用Db('不含表前缀')/Db::name('不含表前缀')/Db::table('含表前缀')返回数组;model()返回对象
  8. 【BIRT】使用rptlibrary设置统一数据源
  9. php怎么查自己的文件编码,php检测文件编码的方法示例
  10. C语言中sizeof和strlen的区别是什么
  11. maven学习(2)
  12. oc27--synthesize,省略getset实现
  13. mcinabox运行库下载_mcinabox下载-mcinabox运行库(附安装教程)最新官网版下载v0.1.3-1y2y游戏...
  14. 车牌识别系统论文python_车牌识别系统的设计与实现毕业论文
  15. 12个从小到超级成功的博客案例研究
  16. 混淆矩阵 matlab代码示例
  17. 构建高可用MYSQL主从复制集群
  18. 山东航天九通车联网:大数据技术引领为智慧物流赋能
  19. 面试笔记(51信用卡-Java开发实习)
  20. Three.js - 图形界面工具(lil-gui)(四)

热门文章

  1. tm8211的i2s协议
  2. 【预测模型】基于布谷鸟算法优化最小二乘支持向量机lssvm实现预测matlab代码
  3. numpy数组打印格式设置
  4. graphpad 中文版使用手册
  5. 用友t3 服务器通讯协议,远程登陆用友t3服务器
  6. JSbridge原理与实现简析
  7. 命令行字体推荐-更纱黑体
  8. UE4 如何导入外部插件包
  9. java计算机毕业设计基于安卓Android的团务智慧管理APP(源码+系统+mysql数据库+Lw文档)
  10. 【Allennlp】: 怎样创建Allennlp中的Configuration文件