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

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

function getip()

{

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'];

}

return preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : 'unknown';

}

//===================================

//

// 功能:IP地址获取真实地址函数

// 参数:$ip - IP地址

// 作者:[Discuz!] (C) Comsenz Inc.

//

//===================================

function convertip($ip) {

//IP数据文件路径

$dat_path = './qqWry.dat';

//检查IP地址

if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){

return 'IP Address Error';

}

//打开IP数据文件

if(!$fd = @fopen($dat_path, 'rb')){

return 'IP date file not exists or access denied';

}

//分解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 

$ipend = implode('', unpack('L', $DataEnd));

if($ipend 

$ipAllNum = ($ipend - $ipbegin) / 7 + 1;

$BeginNum = 0;

$EndNum = $ipAllNum;

//使用二分查找法从索引记录中搜索匹配的IP记录

while($ip1num>$ipNum || $ip2num

$Middle= intval(($EndNum + $BeginNum) / 2);

//偏移指针到索引位置读取4个字节

fseek($fd, $ipbegin + 7 * $Middle);

$ipData1 = fread($fd, 4);

if(strlen($ipData1) 

fclose($fd);

return 'System Error';

}

//提取出来的数据转换成长×××,如果数据是负数则加上2的32次幂

$ip1num = implode('', unpack('L', $ipData1));

if($ip1num 

//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环

if($ip1num > $ipNum) {

$EndNum = $Middle;

continue;

}

//取完上一个索引后取下一个索引

$DataSeek = fread($fd, 3);

if(strlen($DataSeek) 

fclose($fd);

return 'System Error';

}

$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));

fseek($fd, $DataSeek);

$ipData2 = fread($fd, 4);

if(strlen($ipData2) 

fclose($fd);

return 'System Error';

}

$ip2num = implode('', unpack('L', $ipData2));

if($ip2num 

//没找到提示未知

if($ip2num 

if($Middle == $BeginNum) {

fclose($fd);

return 'Unknown';

}

$BeginNum = $Middle;

}

}

//下面的代码读晕了,没读明白,有兴趣的慢慢读

$ipFlag = fread($fd, 1);

if($ipFlag == chr(1)) {

$ipSeek = fread($fd, 3);

if(strlen($ipSeek) 

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) 

fclose($fd);

return 'System Error';

}

$ipFlag = fread($fd, 1);

if($ipFlag == chr(2)) {

$AddrSeek2 = fread($fd, 3);

if(strlen($AddrSeek2) 

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) 

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;

}

$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]."的朋友')";

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值