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地址。


完整代码:

<?phperror_reporting(0);//获取访客真实IPfunctiongetip(){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(!$fd=@fopen($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]."的朋友')";?>