php数据库ip,php读取纯真ip数据库使用示例
/*--------------------------------------------------
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数据库使用示例相关推荐
- 读取纯真IP数据库的公用组件QQWry.NET
这是一个读取纯真IP数据库的公用组件接口,我是通过luma的<纯真IP数据库格式详解>了解了纯真IP数据库数据格式,并且基于网络上的一个IPLocation.dll源码的基础改编而来.我为 ...
- php 读取纯真书库,PHP读取纯真IP数据库的函数
PHP读取纯真IP数据库的函数,以下代码提取自Discuz! X2 $tinyipfile Discuz! 独有高压缩比算法和快速检索的IP数据库路径 下载地址:http://www.discuz.n ...
- java读取纯真IP数据库qqwry.dat的源代码
java读取纯真IP数据库QQwry.dat的源代码,要运行此程序必须有 到网上下载QQwry.dat,下载地址 http://www.cz88.net/down/ 由于太大,我这里就不提供了. ...
- mysql 纯真ip 导出dat_C# 读取纯真IP数据库QQWry.dat获取地区信息
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace 纯真IP数据 ...
- PHP读取纯真IP地址数据库
纯真IP地址数据库应该是国内最流行的IP地址数据库 纯真IP地址数据库(官方下载) http://www.cz88.net/fox/ipdat.shtml<?php /*------------ ...
- java 纯真ip 乱码_纯真ip地址数据库乱码解决方案、utf8和gbk相互转换及下载
在使用discuz3.4论坛时,官方只提供了utf-8版本,不再提供gbk版本,因此为顺应趋势,安装使用了discuz3.4 utf-8的版本.然而,在用纯真IP库替换Discuz的默认库时却出现ip ...
- java纯真ip数据库_java实现对纯真IP数据库的查询
1.IP记录实体类 package com.guess.tools; /** * * 一条IP范围记录,不仅包括国家和区域,也包括起始IP和结束IP * * * @author swallow */ ...
- Discuz!开发之替换系统IP库为纯真IP库的方法
Discuz!默认使用的IP库只有1M,运行时占用资源少,但很多ip不准确,更新也慢,默认存放的路径在data/ipdata/tinyipdata.dat,这里给大家介绍如何将系统IP库换成纯真ip库 ...
- 怎样读取服务器上的数据库文件,如何读取服务器的数据库文件
如何读取服务器的数据库文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 本手 ...
- python调用数据库数据类型_ajax 读取python的数据库数据类型
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
最新文章
- C++ 智能指针std::shared_ptr简单使用和理解
- 偶然发现了获取有ID的dom的一种方法
- 解决HP ProLiant DL380 G5的Centos 7安装与启动不能识别硬盘问题
- linux启动大叶机制,DPDK-Suricata应用部署
- Linux驱动(8)--内核编译与配置
- mysql timestamp 默认值是什么#039;_MYSQL中TIMESTAMP类型的默认值
- Spring Boot 分页插件PageHelper
- 敏捷开发一千零一问系列之九:总体架构什么时机进行?(上)
- Java 绘制艺术图案
- 【转】用C#获取浏览文件夹对话框
- Windows8、Windows8.1使用便签工具
- 自动驾驶 从入门到精通 学习资料汇总 Week1~Week7
- app--查看包名的五种常用方法
- 怎么复制黑苹果config配置_[黑苹果硬件] 实用黑苹果配置推荐
- 漫谈程序员(十三)健康程序猿系列之男人晚睡的7大危害
- 【刷题】LOJ 6008 「网络流 24 题」餐巾计划
- windows核心编程之用户模式下的线程同步
- ES6_1.块级作用域绑定_临时死区TDZ
- 用计算机算日期,200天纪念是在哪一天,几月几日?
- Linux 下安装 oracle 19c(linux版本 centos 7)