如何在我们的网站中利用IP地址库进行统计,并且节约我们的虚拟主机的数据库空间,以下是个人使用的方法:
1. 下载纯真IP地址库
我用的版本:
记录总数:365270条
更新日期:2009年1月15日
数据库版本:纯真
2. 运行ShowIP.exe进行解压,得到类似以下内容的文件:
3.0.0.0 3.255.255.255 美国 新泽西通用电气公司
3. 用Microsoft Access 2003按固定长度将文件导入成一个表
F0:自动生成列(数值)
F1:3.0.0.0 //起始位置
F2:3.255.255.255 //结束位置
F3:美国 //国家/地区
F4:新泽西通用电气公司 //详细地址
F5:美国 //地区,此列的数据为省份或者地区,从F3/F4解析而来,目的是为了在线统计时可以按省份或地区统计
4. 将Access表导出为文件
格式如下:
158080,211.67.168.0,211.67.175.255,河南省郑州市,河南省教育厅,河南省
5. 将导出文件进行转换,将Ip地址转换为数值,目的是在运行时不再转换提高速度
158080,3544426496,3544428543,河南省郑州市,河南省教育厅,河南省
以下是转换程序:
//将导出文件进行转换
function convertipaddress()
{
$result['country']='';
$result['address']='';
$find=false;
$i=0;
$handle=fopen($base_path."install/ipdata1.sql", "r");
$handle1=fopen($base_path."install/ipdata.sql", "w");
while(!feof($handle))
{
$buffer=fgets($handle, 1024);
$ipdata=explode(",", $buffer);
fwrite($handle1,$ipdata[0].','.ip2num($ipdata[1]).','.ip2num($ipdata[2]).','.$ipdata[3].','.$ipdata[4].','.$ipdata[5]);
}
fclose ($handle);
fclose ($handle1);
}
//地址转换为数值
function ip2num($ipaddress)
{
$ipnumber=0;
$ipdata=explode( '.', $ipaddress);
if(count($ipdata )==4)
{
foreach( $ipdata as $key => $val )
{
$ipnumber += intval( $val ) * pow ( 256, 3-$key );
}
}
return $ipnumber;
}
6. 根据IP地址(数值)获取地址信息
function getipaddress($ipnumber)
{
//declare variable
global $dbhost,$dbname,$dbuser,$dbpassword,$pagecharacter,$dbclientcharacter,$dbcharacter,$tableprefix;
global $base_path,$count_ipdata_import;
$result['country']='';
$result['address']='';
$find=false;
$i=0;
//init variable
$dbtemp=new dbcontext;
//open context
$dbtemp->opencontext($dbhost,$dbname,$dbuser,$dbpassword,$dbclientcharacter,$dbcharacter);
//已经导入过了,直接从表里读取
$strsql="select country,address,region from {$tableprefix}ipdata where $ipnumber>=ipstart and $ipnumber<=ipend";
$query=$dbtemp->execute($strsql);
if($row=$dbtemp->fetcharray($query))
{
$result['country']=trim($row['country']);//返回国家/区域
$result['address']=trim($row['address']);//返回详细地址
$result['region']=trim($row['region']); //返回省份/地区
}
else //get address from file
{
if($count_ipdata_import)//是否实时导入
{
if(is_file($base_path."install/ipdata.sql"))
{
$handle=fopen($base_path."install/ipdata.sql", "r");
while(!feof($handle))
{
$buffer=fgets($handle, 1024);
$buffer=str_replace('\r','',$buffer);
$buffer=str_replace('\n','',$buffer);
$ipdata=explode(",", $buffer);
if(($ipnumber)<=($ipdata[2]) && ($ipnumber)>=($ipdata[1]))//找到IP段
{
$ipstart=$ipdata[1];
$ipend=$ipdata[2];
//find it
$result['country']=trim($ipdata[3]);
$result['address']=trim($ipdata[4]);
$result['region']=(sizeof($ipdata)>5 ? trim($ipdata[5]) : $result['country']);
//将找到的记录插入数据库
executecommand("insert into {$tableprefix}ipdata(ipstart,ipend,country,address,region) values(".trim($ipstart).",".trim($ipend).",'".trim($ipdata[3])."','".trim($ipdata[4])."','".(sizeof($ipdata)>5 ? trim($ipdata[5]) : '')."')");
$find=true;
break;
}
}
fclose ($handle);
if(!$find)//没有找到
executecommand("insert into {$tableprefix}ipdata(ipstart,ipend,country,address,region) values($ipnumber,$ipnumber,'Unknown','Unknown','Unknown')");
}
}
}
//close context
$dbtemp->closecontext();
return $result;
}
嘿嘿,不错吧! |