织梦(DedeCMS)系统将IP地址转换为纯真IP数据库的地区的实现函数

“将织梦系统的IP地址转换为纯真IP数据库的函数”,通过这个函数,可以实现类似于本站评论处的那样的显示IP地址所在地区。
一、实现方法
1)函数编写
本来是以前的版本,我是通过JS方式来调用的,但这种方式在有些页面可能会不兼容。后来就升级了函数方式,但一直没更新。好了,我们来看看具体的函数编写方法:
在/include/extend.func.php 文件中的?>的上面加入以下函数代码:

 

function convertip($ip){
     $dat_path = DEDEDATA . '/ip/QQWry.dat';
     if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){
         return 'IP格式错误';
         }
     if(!$fd = @fopen($dat_path, 'rb')){
         return '无法打开IP数据库';
         }
     $ip = explode('.', $ip);
     $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
     $DataBegin = fread($fd, 4);
     $DataEnd = fread($fd, 4);
     $ipbegin = implode('', unpack('L', $DataBegin));
     if($ipbegin < 0) $ipbegin += pow(2, 32);
     $ipend = implode('', unpack('L', $DataEnd));
     if($ipend < 0) $ipend += pow(2, 32);
     $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
     $BeginNum = 0;
     $EndNum = $ipAllNum;
     while($ip1num > $ipNum || $ip2num < $ipNum){
         $Middle = intval(($EndNum + $BeginNum) / 2);
         fseek($fd$ipbegin + 7 * $Middle);
         $ipData1 = fread($fd, 4);
         if(strlen($ipData1) < 4){
             fclose($fd);
             return 'System Error';
             }
         $ip1num = implode('', unpack('L', $ipData1));
         if($ip1num < 0) $ip1num += pow(2, 32);
         if($ip1num > $ipNum){
             $EndNum = $Middle;
             continue;
             }
         $DataSeek = fread($fd, 3);
         if(strlen($DataSeek) < 3){
             fclose($fd);
             return 'System Error';
             }
         $DataSeek = implode('', unpack('L', $DataSeek . chr(0)));
         fseek($fd$DataSeek);
         $ipData2 = fread($fd, 4);
         if(strlen($ipData2) < 4){
             fclose($fd);
             return 'System Error';
             }
         $ip2num = implode('', unpack('L', $ipData2));
         if($ip2num < 0) $ip2num += pow(2, 32);
         if($ip2num < $ipNum){
             if($Middle == $BeginNum){
                 fclose($fd);
                 return 'Unknown';
                 }
             $BeginNum = $Middle;
             }
         }
     $ipFlag = fread($fd, 1);
     if($ipFlag == chr(1)){
         $ipSeek = fread($fd, 3);
         if(strlen($ipSeek) < 3){
             fclose($fd);
             return 'System Error';
             }
         $ipSeek = implode('', unpack('L', $ipSeek . chr(0)));
         fseek($fd$ipSeek);
         $ipFlag = fread($fd, 1);
         }
     if($ipFlag == chr(2)){
         $AddrSeek = fread($fd, 3);
         if(strlen($AddrSeek) < 3){
             fclose($fd);
             return 'System Error';
             }
         $ipFlag = fread($fd, 1);
         if($ipFlag == chr(2)){
             $AddrSeek2 = fread($fd, 3);
             if(strlen($AddrSeek2) < 3){
                 fclose($fd);
                 return 'System Error';
                 }
             $AddrSeek2 = implode('', unpack('L', $AddrSeek2 . chr(0)));
             fseek($fd$AddrSeek2);
             }else{
             fseek($fd, -1, SEEK_CUR);
             }
         while(($char = fread($fd, 1)) != chr(0))
         $ipAddr2 .= $char;
         $AddrSeek = implode('', unpack('L', $AddrSeek . chr(0)));
         fseek($fd$AddrSeek);
         while(($char = fread($fd, 1)) != chr(0))
         $ipAddr1 .= $char;
         }else{
         fseek($fd, -1, SEEK_CUR);
         while(($char = fread($fd, 1)) != chr(0))
         $ipAddr1 .= $char;
         $ipFlag = fread($fd, 1);
         if($ipFlag == chr(2)){
             $AddrSeek2 = fread($fd, 3);
             if(strlen($AddrSeek2) < 3){
                 fclose($fd);
                 return 'System Error';
                 }
             $AddrSeek2 = implode('', unpack('L', $AddrSeek2 . chr(0)));
             fseek($fd$AddrSeek2);
             }else{
             fseek($fd, -1, SEEK_CUR);
             }
         while(($char = fread($fd, 1)) != chr(0)){
             $ipAddr2 .= $char;
             }
         }
     fclose($fd);
     // 最后做相应的替换操作后返回结果
    if(preg_match('/http/i', $ipAddr2)){
         $ipAddr2 = '';
         }
     $ipaddr = "$ipAddr1 $ipAddr2";
     $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
     $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
     $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
     if(preg_match('/http/i', $ipaddr) || $ipaddr == ''){
         $ipaddr = 'Unknown';
         }
     return $ipaddr;
     }

 

 

  

复制代码      保存后关闭即可。
2)调用方法
直接通过 {dede:field.ip function="convertip(@me)"/}来调用即可。
在PHP文件中,也可以直接使用:

    $ipadress = convertip($ip);

 

 

来获得IP地址的地区数据,注意$ip为实际IP地址的变量。
 

 

 

posted on 2012-11-25 17:40  seaven  阅读(1653)  评论(0编辑  收藏  举报

导航