1. 云栖社区>
  2. PHP教程>
  3. 正文

php获取访客所在城市名称代码

作者:用户 来源:互联网 时间:2017-12-01 16:52:19

php代码获取名称城市访客

php获取访客所在城市名称代码 - 摘要: 本文讲的是php获取访客所在城市名称代码, php获取访客所在城市名称代码,采用纯真QQ IP数据库,想要使用最新版IP数据库可到纯真官网获取。 纯真IP数据库官网:http://www.cz88.net/ 将下载的IP数据库文件替换压缩包中的qqwry.dat文件即可。 压缩包下


php获取访客所在城市名称代码,采用纯真QQ IP数据库,想要使用最新版IP数据库可到纯真官网获取。

纯真IP数据库官网:http://www.cz88.net/

将下载的IP数据库文件替换压缩包中的qqwry.dat文件即可。

压缩包下载:php获取访客所在城市名称代码

代码如下:

$ip=getip();
$area=convertip($ip);
$city=explode("",$area);
header('Content-type:text/javascript;charset=gb2312');
echo"document.write('".$city[0]."')";
//echo"document.write('您好,来自".$city[0]."的朋友')";

代码中封装了两个函数,分别是getip()和convertip($ip),其中getip()函数的功能是获取当前访客的IP地址,convertip($ip)函数为获取访客的所在地名称,传入的参数$ip为使用getip()获取到的IP地址。

完整代码:

<?php
error_reporting(0);
//获取访客真实IP
functiongetip()
{
if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown'))
{
$ip=getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown'))
{
$ip=getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown'))
{
$ip=getenv('REMOTE_ADDR');
}
elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown'))
{
$ip=$_SERVER['REMOTE_ADDR'];
}
returnpreg_match("/[/d/.]{7,15}/",$ip,$matches)?$matches[0]:'unknown';
}

//===================================
//
//功能:IP地址获取真实地址函数
//参数:$ip-IP地址
//作者:[Discuz!](C)ComsenzInc.
//
//===================================
functionconvertip($ip){
//IP数据文件路径
$dat_path='./qqWry.dat';

//检查IP地址
if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$",$ip)){
return'IPAddressError';
}

//打开IP数据文件
if([email protected]($dat_path,'rb')){
return'IPdatefilenotexistsoraccessdenied';
}

//分解IP进行运算,得出整形数
$ip=explode('.',$ip);
$ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];

//获取IP数据索引开始和结束位置
$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;

//使用二分查找法从索引记录中搜索匹配的IP记录
while($ip1num>$ipNum||$ip2num<$ipNum){
$Middle=intval(($EndNum+$BeginNum)/2);

//偏移指针到索引位置读取4个字节
fseek($fd,$ipbegin+7*$Middle);
$ipData1=fread($fd,4);
if(strlen($ipData1)<4){
fclose($fd);
return'SystemError';
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$ip1num=implode('',unpack('L',$ipData1));
if($ip1num<0)$ip1num+=pow(2,32);

//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
if($ip1num>$ipNum){
$EndNum=$Middle;
continue;
}

//取完上一个索引后取下一个索引
$DataSeek=fread($fd,3);
if(strlen($DataSeek)<3){
fclose($fd);
return'SystemError';
}
$DataSeek=implode('',unpack('L',$DataSeek.chr(0)));
fseek($fd,$DataSeek);
$ipData2=fread($fd,4);
if(strlen($ipData2)<4){
fclose($fd);
return'SystemError';
}
$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'SystemError';
}
$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'SystemError';
}
$ipFlag=fread($fd,1);
if($ipFlag==chr(2)){
$AddrSeek2=fread($fd,3);
if(strlen($AddrSeek2)<3){
fclose($fd);
return'SystemError';
}
$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'SystemError';
}
$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=getip();
$area=convertip($ip);
$city=explode("",$area);
header('Content-type:text/javascript;charset=gb2312');
echo"document.write('".$city[0]."')";
//echo"document.write('您好,来自".$city[0]."的朋友')";
?>

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 代码 , 获取 , 名称 , 城市 , 访客 ,以便于您获取更多的相关知识。