温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-17 16:14:30 阅读:1956 作者:gutaotao1989 栏目:web开发
PHP开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

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($fd4);
    $DataEnd fread($fd4);
    $ipbegin implode(''unpack('L'$DataBegin));
    if($ipbegin 0$ipbegin += pow(232);
    $ipend implode(''unpack('L'$DataEnd));
    if($ipend 0$ipend += pow(232);
    $ipAllNum = ($ipend $ipbegin) / 7 + 1;
 
    $BeginNum 0;
    $EndNum $ipAllNum;
 
    //使用二分查找法从索引记录中搜索匹配的IP记录
    while($ip1num>$ipNum || $ip2num<$ipNum) {
        $Middleintval(($EndNum $BeginNum) / 2);
 
        //偏移指针到索引位置读取4个字节
        fseek($fd$ipbegin 7 * $Middle);
        $ipData1 fread($fd4);
        if(strlen($ipData1) < 4) {
            fclose($fd);
            return 'System Error';
        }
        //提取出来的数据转换成长×××,如果数据是负数则加上2的32次幂
        $ip1num implode(''unpack('L'$ipData1));
        if($ip1num 0$ip1num += pow(232);
 
        //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
        if($ip1num $ipNum) {
            $EndNum $Middle;
            continue;
        }
 
        //取完上一个索引后取下一个索引
        $DataSeek fread($fd3);
        if(strlen($DataSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $DataSeek implode(''unpack('L'$DataSeek.chr(0)));
        fseek($fd$DataSeek);
        $ipData2 fread($fd4);
        if(strlen($ipData2) < 4) {
            fclose($fd);
            return 'System Error';
        }
        $ip2num implode(''unpack('L'$ipData2));
        if($ip2num 0$ip2num += pow(232);
 
        //没找到提示未知
        if($ip2num $ipNum) {
            if($Middle == $BeginNum) {
                fclose($fd);
                return 'Unknown';
            }
            $BeginNum $Middle;
        }
    }
 
    //下面的代码读晕了,没读明白,有兴趣的慢慢读
    $ipFlag fread($fd1);
    if($ipFlag == chr(1)) {
        $ipSeek fread($fd3);
        if(strlen($ipSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $ipSeek implode(''unpack('L'$ipSeek.chr(0)));
        fseek($fd$ipSeek);
        $ipFlag fread($fd1);
    }
 
    if($ipFlag == chr(2)) {
        $AddrSeek fread($fd3);
        if(strlen($AddrSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $ipFlag fread($fd1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 fread($fd3);
            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($fd1)) != chr(0))
            $ipAddr2 .= $char;
 
        $AddrSeek implode(''unpack('L'$AddrSeek.chr(0)));
        fseek($fd$AddrSeek);
 
        while(($char fread($fd1)) != chr(0))
            $ipAddr1 .= $char;
    } else {
        fseek($fd, -1, SEEK_CUR);
        while(($char fread($fd1)) != chr(0))
            $ipAddr1 .= $char;
 
        $ipFlag fread($fd1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 fread($fd3);
            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($fd1)) != 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]."的朋友')";
?>

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×