emlog系统存储了评论人的IP地址,有的时候,需要显示该IP的真实地理地址,可以通过以下两种方法获得。
本地获得IP地理地址。通过本地查找本地IP数据库(纯真版)来获得,IP数据库可以到http://www.cz88.net/下载安装后,在安装目录里把qqwry.dat文件提取出来放到emlog根目录即可。 (保证与index.php同在一个目录中)
在module.php中添加以下代码:
<?php
//获取IP地理地址
$data = '254.254.254.254';
class IpLocation {
var $fp;
var $firstip;
var $lastip;
var $totalip;
function getlong() {
$result = unpack('Vlong', fread($this->fp, 4));
return $result['long'];
}
function getlong3() {
$result = unpack('Vlong', fread($this->fp, 3).chr(0));
return $result['long'];
}
function packip($ip) {
return pack('N', intval(ip2long($ip)));
}
function getstring($data = "") {
$char = fread($this->fp, 1);
while (ord($char) > 0) {
$data .= $char;
$char = fread($this->fp, 1);
}
return $data;
}
function getarea() {
$byte = fread($this->fp, 1);
switch (ord($byte)) {
case 0:
$area = "";
break;
case 1:
case 2:
fseek($this->fp, $this->getlong3());
$area = $this->getstring();
break;
default:
$area = $this->getstring($byte);
break;
}
return $area;
}
function getlocation($ip) {
if (!$this->fp) return null;
$location['ip'] = gethostbyname($ip);
$ip = $this->packip($location['ip']);
$l = 0;
$u = $this->totalip;
$findip = $this->lastip;
while ($l <= $u) {
$i = floor(($l + $u) / 2);
fseek($this->fp, $this->firstip + $i * 7);
$beginip = strrev(fread($this->fp, 4));
if ($ip < $beginip) {
$u = $i - 1;
}
else {
fseek($this->fp, $this->getlong3());
$endip = strrev(fread($this->fp, 4));
if ($ip > $endip) {
$l = $i + 1;
}
else {
$findip = $this->firstip + $i * 7;
break;
}
}
}
fseek($this->fp, $findip);
$location['beginip'] = long2ip($this->getlong());
$offset = $this->getlong3();
fseek($this->fp, $offset);
$location['endip'] = long2ip($this->getlong());
$byte = fread($this->fp, 1);
switch (ord($byte)) {
case 1:
$countryOffset = $this->getlong3();
fseek($this->fp, $countryOffset);
$byte = fread($this->fp, 1);
switch (ord($byte)) {
case 2:
fseek($this->fp, $this->getlong3());
$location['country'] = $this->getstring();
fseek($this->fp, $countryOffset + 4);
$location['area'] = $this->getarea();
break;
default:
$location['country'] = $this->getstring($byte);
$location['area'] = $this->getarea();
break;
}
break;
case 2:
fseek($this->fp, $this->getlong3());
$location['country'] = $this->getstring();
fseek($this->fp, $offset + 8);
$location['area'] = $this->getarea();
break;
default:
$location['country'] = $this->getstring($byte);
$location['area'] = $this->getarea();
break;
}
if ($location['country'] == " CZNET") {
$location['country'] = "未知";
}
if ($location['area'] == " CZNET") {
$location['area'] = "";
}
return $location;
}
function IpLocation($filename = "qqwry.dat") {
$this->fp = 0;
if (($this->fp = @fopen($filename, 'rb')) !== false) {
$this->firstip = $this->getlong();
$this->lastip = $this->getlong();
$this->totalip = ($this->lastip - $this->firstip) / 7;
register_shutdown_function(array(&$this, '_IpLocation'));
}
}
function _IpLocation() {
if ($this->fp) {
fclose($this->fp);
}
$this->fp = 0;
}
}
function getaddress($myip){
$ipOrDomain=$myip;
$iplocation = new IpLocation();
$location = $iplocation->getlocation($ipOrDomain);
$address=mb_convert_encoding($location['country'].$location['area'], "utf-8", "gbk");
return $address;
}
?>
然后在需要显示的地方插入 <?php echo getaddress($comment['ip']);?> 即可。
二、通过远程网站相关接口实现。
在module.php中添加以下代码:
<?php //blog:获取IP地址所在地,提取新浪IP接口 function getaddress($ip) { //调用sina查询接口 $str = file_get_contents("http://counter.sina.com.cn/ip?ip=".$ip); //转换字符集 $str = mb_convert_encoding($str,"UTF-8","GBK"); //匹配结果 preg_match_all('/[\x{4e00}-\x{9fa5}]+/u',$str,$get); //将数组转换成字符串 $add = implode('-',$get[0]); //返回结果 return $add; } ?>
然后在需要显示的地方插入 <?php echo getaddress($comment['ip']);?> 即可。
附我的博客的显示方式,需要修改module.php文件:
1.查找 <strong><?php echo $comment['poster']; ?></strong>
修改为
<strong><?php echo $comment['poster']; ?></strong><a title= <?php echo getaddress($comment['ip']);?>> <img src="./content/templates/uu_hcms/images/common/ip.png"></a>
//"./content/templates/uu_hcms/images/common/ip.png"根据实际情况修改
2.继续查找
<strong><?php echo $comment['poster']; ?></strong>
修改为
<strong><?php echo $comment['poster']; ?></strong><a title= <?php echo getaddress($comment['ip']);?>> <img src="./content/templates/uu_hcms/images/common/ip.png"></a>
其中ip.png这个图标会显示在评论人的后面,图片自找,或到我的博客复制一个,鼠标放上去会显示地理地址。
谢谢赞赏
(微信扫一扫或长按识别)