绿色排版工具|热门专题|网站地图|移动官网
您的当前位置:网站首页 > 建站教程 > 织梦cms建站教程 > 正文

织梦(dedecms)将IP地址转换为纯真IP数据库的地区的

来源: 编辑: 时间:2017-12-28 11:15:58 阅读:

大家知道(dedecms)的后台可以查询发布文章和评论的IP地址,dedecms默认的IP地址库却不是现在最流行纯真IP数据库,那么如何将织梦cms的IP地址转换为纯真IP数据库的函数呢?

  可以通过以下方法修改实现

  实现方法

  第一步:函数编写

  在/include/extend.func.php文件中的?>的上面加入以下函数代码:

/*    
    +------------------------------------------------------------------------+    
    | 本代码来源于织梦教程网(xuewl.com)    
    +------------------------------------------------------------------------+    
    | Author : 华强℡ (QQ:3421209)     
    | Email  : master@xuewl.com     
    | WebSite: http://bbs.xuewl.com     
    | Contact: http://t.qq.com/dede_tech    
    | Copyright @ 2007 - 2012 织梦教程网(xuewl.com)    
    +------------------------------------------------------------------------+    
    + 不管是否为商业用途,您必须保留此头部信息并不得修改,尊重版权从现在做起 +    
*/
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;       
}

保存后即可

  第二步:IP库存放

  请到下载IP库后,将IP地址文件重命名为QQWry.dat并复制到程序根目录的 /data/ip/ 文件夹(若没有ip文件夹,请自行创建)

  第三步:调用方法

  因为本功能已经被封装了,所以其调用方法非常零活多变。

  比如可以用 {dede:field.ip function=”convertip(@me)”/} 的底层来调用,也可以直接在相关的 PHP功能文件里进行转换,比如:$ipadress = convertip($ip);等等。

  功能说明

  本功能可运行在DedeCMS_V5.3 及以上所有版本且不分编码。


图文精选:

Copyright©2012-2030小蚂蚁信息网版权所有 粤ICP备14061018号-1


郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。

Top