/*--------------------------------------------------

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] '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,php读取纯真ip数据库使用示例相关推荐

  1. 读取纯真IP数据库的公用组件QQWry.NET

    这是一个读取纯真IP数据库的公用组件接口,我是通过luma的<纯真IP数据库格式详解>了解了纯真IP数据库数据格式,并且基于网络上的一个IPLocation.dll源码的基础改编而来.我为 ...

  2. php 读取纯真书库,PHP读取纯真IP数据库的函数

    PHP读取纯真IP数据库的函数,以下代码提取自Discuz! X2 $tinyipfile Discuz! 独有高压缩比算法和快速检索的IP数据库路径 下载地址:http://www.discuz.n ...

  3. java读取纯真IP数据库qqwry.dat的源代码

    java读取纯真IP数据库QQwry.dat的源代码,要运行此程序必须有 到网上下载QQwry.dat,下载地址 http://www.cz88.net/down/   由于太大,我这里就不提供了. ...

  4. mysql 纯真ip 导出dat_C# 读取纯真IP数据库QQWry.dat获取地区信息

    using System; using System.Collections.Generic; using System.Text; using System.IO; namespace 纯真IP数据 ...

  5. PHP读取纯真IP地址数据库

    纯真IP地址数据库应该是国内最流行的IP地址数据库 纯真IP地址数据库(官方下载) http://www.cz88.net/fox/ipdat.shtml<?php /*------------ ...

  6. java 纯真ip 乱码_纯真ip地址数据库乱码解决方案、utf8和gbk相互转换及下载

    在使用discuz3.4论坛时,官方只提供了utf-8版本,不再提供gbk版本,因此为顺应趋势,安装使用了discuz3.4 utf-8的版本.然而,在用纯真IP库替换Discuz的默认库时却出现ip ...

  7. java纯真ip数据库_java实现对纯真IP数据库的查询

    1.IP记录实体类 package com.guess.tools; /** * * 一条IP范围记录,不仅包括国家和区域,也包括起始IP和结束IP * * * @author swallow */ ...

  8. Discuz!开发之替换系统IP库为纯真IP库的方法

    Discuz!默认使用的IP库只有1M,运行时占用资源少,但很多ip不准确,更新也慢,默认存放的路径在data/ipdata/tinyipdata.dat,这里给大家介绍如何将系统IP库换成纯真ip库 ...

  9. 怎样读取服务器上的数据库文件,如何读取服务器的数据库文件

    如何读取服务器的数据库文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 本手 ...

  10. python调用数据库数据类型_ajax 读取python的数据库数据类型

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. C++ 智能指针std::shared_ptr简单使用和理解
  2. 偶然发现了获取有ID的dom的一种方法
  3. 解决HP ProLiant DL380 G5的Centos 7安装与启动不能识别硬盘问题
  4. linux启动大叶机制,DPDK-Suricata应用部署
  5. Linux驱动(8)--内核编译与配置
  6. mysql timestamp 默认值是什么#039;_MYSQL中TIMESTAMP类型的默认值
  7. Spring Boot 分页插件PageHelper
  8. 敏捷开发一千零一问系列之九:总体架构什么时机进行?(上)
  9. Java 绘制艺术图案
  10. 【转】用C#获取浏览文件夹对话框
  11. Windows8、Windows8.1使用便签工具
  12. 自动驾驶 从入门到精通 学习资料汇总 Week1~Week7
  13. app--查看包名的五种常用方法
  14. 怎么复制黑苹果config配置_[黑苹果硬件] 实用黑苹果配置推荐
  15. 漫谈程序员(十三)健康程序猿系列之男人晚睡的7大危害
  16. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划
  17. windows核心编程之用户模式下的线程同步
  18. ES6_1.块级作用域绑定_临时死区TDZ
  19. 用计算机算日期,200天纪念是在哪一天,几月几日?
  20. Linux 下安装 oracle 19c(linux版本 centos 7)

热门文章

  1. 编程入门前应该先学什么?
  2. sequelize时间自动格式化
  3. 电子计算机硬件是由哪五个部分构成,计算机硬件系统由哪五个基本部分组成?...
  4. 日期转农历日期的一个插件
  5. 《青年在选择职业时的考虑》——马克思
  6. 一號倉:《漫》--《3D》
  7. JAVA正则表达式校验中国大陆手机号段【2022年2月】
  8. Oracle树形结构拖拽之插队重新排序
  9. 南充十中高考2021成绩查询,2021年南充十中招办电话是多少?
  10. 一见钟情只在瞬息之间,而对爱大彻大悟却需要很多年