当前位置:  -> 首页 -> 如何使用纯真IP地址库(PHP+MySQL)显示地址信息

上一篇 | 下一篇
如何使用纯真IP地址库(PHP+MySQL)显示地址信息
作者:洛羽叶  点击率:4715  发布时间:2009-01-24

如何在我们的网站中利用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;
}
 
嘿嘿,不错吧!
标签: PHP MYSQL IP IP地址 ACCESS 网站设计
引用地址:本站原创
   站点首页      技术人生      旅途足迹      我要留言      友情链接      关于站长   
[本站统计]
在线人数:1
今日访问:24
总访问量:1469486
Copyright 2006-2022 EasyWeb 1.6 订阅 All Rights Reserved
粤ICP备08028977号-1
www.luoriver.com
Created by WWH in 2006