咨询QQ:597459892 邮箱:597459892@qq.com
常见问题 / news
当前位置:主页 > 新闻资讯 > 常见问题 >

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

日期:2017-07-10 16:44 来源: 武威网站建设 关键字: 武威网站开发     阅读量:

蜘蛛秀网络免费提供 如何将IP地址转换为纯真IP数据库。蜘蛛秀网络专注于织梦仿站,织梦模板建站,帝国模板开发,ecshop商城模板,discuz论坛模板建站,企业模板定制,安装调试,并提供建站咨询,网站建设,网站优化相关服务,打造模板建站的领航者 咨询QQ:597459892。

大家知道织梦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;

}

      保存后关闭即可。


下面是我的调用方法


直接通过 {dede:field.ip function="convertip(@me)"/}来调用即可。
在PHP文件中,也可以直接使用:

$ipadress = convertip($ip);

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

搜索相关文章:

(责任编辑:蜘蛛秀网络)

本文由织梦模板、重庆网站建设- www.zhizhuxiu.com原创提供,转载请注明来源。