javascript和JQuery焦点图和代码特效大全
当前最流行的开源CMS网站系统大全
当前位置:首页 > 软件教程 > dedecms

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

来源:IT技术网编辑:疯子发布于:2017-05-18人围观

大家知道织梦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  : [email protected]     
    | 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 及以上所有版本且不分编码。

与相关的文章
有时间的话来看看IT界的突发事件