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