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 < 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 `System Error`;
        }
        //提取出來的資料轉換成長整形,如果資料是負數則加上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 `System Error`;
        }
        $DataSeek = implode(``, unpack(`L`, $DataSeek.chr(0)));
        fseek($fd, $DataSeek);
        $ipData2 = fread($fd, 4);
        if(strlen($ipData2) < 4) {
            fclose($fd);
            return `System Error`;
        }
        $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 `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) < 3) {
            fclose($fd);
            return `System Error`;
        }
        $ipFlag = fread($fd, 1);
        if($ipFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            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($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 `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]."的朋友`)";
?>