加入收藏 | 网站地图 678官网-提供更专业、全面的网络营销、网站帮助教程

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

[使用技巧] 时间:2013-02-06 15:00 来源:ChinaZ 作者:网络 点击:

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

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

  实现方法

  第一步:函数编写

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
    +------------------------------------------------------------------------+
    | 本代码来源于织梦教程网(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库后,将IP地址文件重命名为QQWry.dat并复制到程序根目录的 /data/ip/ 文件夹(若没有ip文件夹,请自行创建)

  第三步:调用方法

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

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

  功能说明

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

(责任编辑:admin)

相关内容
织梦模板
每天与你分享你喜欢的美图!每日分享最新美图,唯美图片,热门图片,微博明星图片。织梦模板之家
分享一下
织梦模板之家
订阅本站
织梦模板之家
精彩推荐
热门点击
友情链接