`

PHP读取纯真IP地址数据库

    博客分类:
  • PHP
阅读更多
纯真IP地址数据库应该是国内最流行的IP地址数据库
纯真IP地址数据库(官方下载)
http://www.cz88.net/fox/ipdat.shtml
 
<?php
/*--------------------------------------------------
    ip2address [qqwry.dat]
--------------------------------------------------*/
 
class ip {
    var $fh; //IP数据库文件句柄
    var $first; //第一条索引
    var $last; //最后一条索引
    var $total; //索引总数
 
    //构造函数
    function __construct() {
        $this->fh = fopen('qqwry.dat', 'rb'); //qqwry.dat文件
        $this->first = $this->getLong4();
        $this->last = $this->getLong4();
        $this->total = ($this->last - $this->first) / 7; //每条索引7字节
    }
 
    //检查IP合法性
    function checkIp($ip) {
        $arr = explode('.',$ip);
        if(count($arr) !=4 ) {
            return false;
        } else {
            for ($i=0; $i < 4; $i++) {
                if ($arr[$i] <'0' || $arr[$i] > '255') {
                    return false;
                }
            }
        }
        return true;
    }
 
    function getLong4() {
        //读取little-endian编码的4个字节转化为长整型数
        $result = unpack('Vlong', fread($this->fh, 4));
        return $result['long'];
    }
 
    function getLong3() {
        //读取little-endian编码的3个字节转化为长整型数
        $result = unpack('Vlong', fread($this->fh, 3).chr(0));
        return $result['long'];
    }
 
    //查询信息
    function getInfo($data = "") {
        $char = fread($this->fh, 1);
        while (ord($char) != 0) { //国家地区信息以0结束
            $data .= $char;
            $char = fread($this->fh, 1);
        }
        return $data;
    }
 
    //查询地区信息
    function getArea() {
        $byte = fread($this->fh, 1); //标志字节
        switch (ord($byte)) {
            case 0: $area = ''; break; //没有地区信息
            case 1: //地区被重定向
                fseek($this->fh, $this->getLong3());
                $area = $this->getInfo(); break;
            case 2: //地区被重定向
            fseek($this->fh, $this->getLong3());
            $area = $this->getInfo(); break;
            default: $area = $this->getInfo($byte);  break; //地区没有被重定向
        }
        return $area;
    }
 
    function ip2addr($ip) {
        if(!$this -> checkIp($ip)){
            return false;
        }
 
        $ip = pack('N', intval(ip2long($ip)));
 
        //二分查找
        $l = 0;
        $r = $this->total;
 
        while($l <= $r) {
            $m = floor(($l + $r) / 2); //计算中间索引
            fseek($this->fh, $this->first + $m * 7);
            $beginip = strrev(fread($this->fh, 4)); //中间索引的开始IP地址
            fseek($this->fh, $this->getLong3());
            $endip = strrev(fread($this->fh, 4)); //中间索引的结束IP地址
 
            if ($ip < $beginip) { //用户的IP小于中间索引的开始IP地址时
                $r = $m - 1;
            } else {
                if ($ip > $endip) { //用户的IP大于中间索引的结束IP地址时
                    $l = $m + 1;
                } else { //用户IP在中间索引的IP范围内时
                    $findip = $this->first + $m * 7;
                    break;
                }
            }
        }
 
        //查询国家地区信息
        fseek($this->fh, $findip);
        $location['beginip'] = long2ip($this->getLong4()); //用户IP所在范围的开始地址
        $offset = $this->getlong3();
        fseek($this->fh, $offset);
        $location['endip'] = long2ip($this->getLong4()); //用户IP所在范围的结束地址
        $byte = fread($this->fh, 1); //标志字节
        switch (ord($byte)) {
            case 1:  //国家和区域信息都被重定向
                $countryOffset = $this->getLong3(); //重定向地址
                fseek($this->fh, $countryOffset);
                $byte = fread($this->fh, 1); //标志字节
                switch (ord($byte)) {
                    case 2: //国家信息被二次重定向
                        fseek($this->fh, $this->getLong3());
                        $location['country'] = $this->getInfo();
                        fseek($this->fh, $countryOffset + 4);
                        $location['area'] = $this->getArea();
                        break;
                    default: //国家信息没有被二次重定向
                        $location['country'] = $this->getInfo($byte);
                        $location['area'] = $this->getArea();
                        break;
                }
                break;
 
            case 2: //国家信息被重定向
                fseek($this->fh, $this->getLong3());
                $location['country'] = $this->getInfo();
                fseek($this->fh, $offset + 8);
                $location['area'] = $this->getArea();
                break;
 
            default: //国家信息没有被重定向
                $location['country'] = $this->getInfo($byte);
                $location['area'] = $this->getArea();
                break;
        }
 
        //gb2312 to utf-8(去除无信息时显示的CZ88.NET)
        foreach ($location as $k => $v) {
            $location[$k] = str_replace('CZ88.NET','',iconv('gb2312', 'utf-8', $v));
        }
 
        return $location;
    }
 
    //析构函数
    function __destruct() {
        fclose($this->fh);
    }
}
 
$ip = new ip();
$addr = $ip -> ip2addr('IP地址');
print_r($addr);
?>

 

分享到:
评论

相关推荐

    PHP利用纯真IP数据库在本地实现IP地址信息查询(无乱码)

    标题中的“PHP利用纯真IP数据库在本地实现IP地址信息查询”是指通过PHP编程语言,结合纯真IP数据库,实现在本地服务器上查询IP地址详细信息的功能。纯真IP数据库通常是中国的一个开源IP数据库,包含了丰富的IP地址段...

    【PHP】根据IP地址查询省市(纯真数据库最新版)

    首先,纯真IP数据库(Zabbix IP库)是中国大陆地区广泛使用的IP地址数据库,它提供了详细的IP地址归属地信息,包括省份、城市等。这个数据库定期更新,确保了IP位置信息的准确性和时效性。在本示例中,你已经获得了...

    php版纯真ip数据库

    纯真IP数据库是中国知名的IP地址库,由纯真网络维护和更新。它以文本文件的形式存储了大量的IP段和对应信息,便于程序进行快速查找。PHP版的实现则将这个数据库与PHP语言结合,提供了易于使用的API接口,使得开发者...

    纯真ip数据库及其例子

    在这个例子中,我们可以看到如何在PHP中读取和解析纯真IP数据库文件,然后使用这些数据来实现IP地址的定位功能。以下是一个基本的PHP代码片段,展示了如何做到这一点: ```php &lt;?php // 打开数据库文件 $database =...

    纯真数据库读取程序代码

    "纯真数据库读取程序代码"是一个用于处理和解析纯真IP数据库的C++源代码项目,包含了两个关键文件:SEU_QQwry.cpp和SEU_QQwry.h。这个程序的主要目的是帮助开发者在他们的应用中快速查找并识别IP地址对应的地理位置...

    纯真IP数据库查询程序

    "纯真IP数据库查询程序"是一款专用于IP地址查询的实用工具,其核心功能是通过内置的IP数据库——QQWry.Dat,为用户提供快速、准确的地理位置信息。这款工具简单易用,用户只需运行主程序ShowIP.exe,就能轻松查询到...

    php读取纯真ip数据库使用示例

    在PHP中,读取纯真IP数据库(通常指的是QQWry.Dat)是为了实现IP到地理位置的转换。这个过程涉及到二分查找算法和文件处理技巧。以下是对标题和描述中涉及知识点的详细解释: 1. **纯真IP数据库**:这通常是指由...

    PHP 根据IP地址获取所在城市代码以及纯真ip库qqwry.dat下载

    纯真IP库(qqwry.dat)是中国流行的IP地址数据库,包含了大量的IP段和对应的地理位置信息。这个数据库文件以特定的格式存储数据,便于快速查找。使用这种库可以高效地将IP地址映射到城市或其他地理位置,避免了每次...

    php-纯真ip查询

    在IT领域,特别是Web开发中,PHP是一种...总的来说,"php-纯真ip查询"是基于PHP的IP地理位置查询解决方案,通过结合QQWry.Dat数据库和自定义的PHP脚本,实现了对IP地址的快速定位,对于开发者来说是一个实用的工具。

    PHP代码 IP 位置查询 IP 数据库 QQWay 纯真数据库

    在提供的标题和描述中提到了"PHP代码 IP 位置查询 IP 数据库 QQWay 纯真数据库",这涉及到使用PHP编程语言进行IP地址查询,并结合QQWay的纯真数据库来实现这一目标。接下来,我们将深入探讨这个主题。 首先,让我们...

    最新纯真IP数据库+PHP查询程序

    在这个IP查询程序中,PHP被用来处理HTTP请求,解析输入的IP地址,并通过读取纯真IP数据库(.DAT文件)来获取对应IP的地理位置信息。由于PHP具有良好的文本处理能力,因此非常适合处理像DAT这样的非结构化文本文件。 ...

    PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)

    通过本文的介绍,我们可以了解到使用PHP结合纯真IP数据库qqwry.dat来获取IP地址所在地信息的具体实现方法。这种方法可以有效地帮助开发者进行地理位置相关的数据分析和个性化服务。在实际应用中,开发者需要根据实际...

    基于PHP的IP地址查询程序(QQwry纯真数据库版)源码.zip

    QQwry数据库是由国内著名的IP地址库提供商纯真IP数据库提供,它包含了大量的国内外IP地址信息,如国家、地区、城市等地理定位数据。这个程序能够帮助网站或应用程序快速查询访问者或者特定IP地址的地理位置信息,...

    IP地址归属地查询PHP版

    总结来说,这个PHP版的IP地址归属地查询系统利用“纯真IP数据库”提供服务,核心在于`qqwry.php`的实现和`QQWry.Dat`的数据支持,通过合理的维护和更新,可以为用户提供准确的全球IP地址地理位置信息。

    从Discuz!中提取的PHP版IP数据库

    最后,"纯真"通常指的是“纯真IP库”,这是一个在中国广泛应用的IP地址数据库,提供了详细的IP到地理位置的映射,包括国内和国际的IP信息。 【压缩包子文件的文件名称列表】只有一个:"ip",这可能是数据库文件的...

    PHP使用纯真数据IP库转换物理IP

    首先,纯真IP数据库(通常称为“Zabbix”或“纯真IP库”)是一个包含大量IP地址与地理位置对应关系的数据集合。这个数据库经常更新,以确保IP地址的地理位置信息准确无误。在PHP中使用这个库,可以方便地将IP地址...

    IP数据库-纯真IP-qqwry.dat

    总之,“纯真IP数据库”的qqwry.dat文件是互联网开发中一个重要的工具,通过它我们可以便捷地获取到IP地址背后的地理位置信息。正确理解和使用这个数据库,将有助于提升我们的网络服务质量和用户体验。但在利用这些...

Global site tag (gtag.js) - Google Analytics