如何将IP地址转换为纯真IP数据库

大家知道织梦CMS的后台可以查询发布文章和评论的IP地址,系统默认的IP地址库却不是现在最流行纯真IP数据库,那么如何将织梦系统的IP地址转换为纯真IP数据库的函数呢?在网上搜索一下,还真的找到实现的方法。

 大家知道织梦CMS的后台可以查询发布文章和评论的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;

}

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DedeCMS自带Rss功能,在管理后台可以生成出一个Rss地图页面,默认是/data/rssmap.html;这个Html地图文件会告知用户每个栏目的rss订阅地址,这个功能很适合栏目及文章较多的网站,但不太适合文章页不多的小型站点;我偏向于使用统一的Rss地址来输出全站所有文
DEDECMS的默认搜索框只可以用DEDECMS自己的搜索引擎进行搜索,而我在别的站上看到可以通过百度、谷歌等外部搜索引擎进行站内搜索,总是感觉外部似乎更专业点,于是我也动手修改了一些代码,终于将织梦CMS的搜索框改一个可以通过外部搜索引擎进行搜索的多功能
一般的网站在发布文章时,会要求填写文章来源或者作者信息。但是有时候我们并不需要,这样我们就可能会留空,或者填写来源网络,作者匿名之类的。 可是,我想了一相,能不能在不填写来源信息的时候,显示指定信息或者不显示来源或者作者呢?
最近用DEDECMS做了个发布信息的网站,需要实现网站会员投稿后,前台能自动更新的功能。先是官方论坛进行查找,只发现有人在问,却没有人回答。没办法,只好自己动手操作,还真是花了不少的功夫。
在开发网站的一项功能时,使用{dede:arclistsg type='image.' imgwidth='143' imgheight='106' }这个标签的语句,或许是因为第一次真正使用DEDECMS,还是遇到2个小问题,经过一番研究,最终很容易地解决了,在这里把解决小技巧告诉大家。
最近刚学习用织梦CMS建站。刚开始建的,没有什么经验,栏目老是需要修修改改的。在这修改的过程,我发现了一个问题,就是如果你删除了所有栏目了,再新建的栏目ID不会从头开始,也就是说ID竟然不是1。感觉这点,DEDECMS做的不够人性化。