PW自身就有根據IP判斷所屬地區的功能,只要經常更新IP庫就沒什麼問題.至於根據歸屬地跳轉到相應頁面就需要你自己去寫了。網上幫你找了一個,看是否合適。
。<?php
//返回當前IP的城市字串
function convertip($ip) {
//IP資料檔案路徑
$dat_path = "QQWry.Dat";
//檢查IP地址
if(!preg_match("/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/", $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) {
$DataSeek = implode("", unpack("L", $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(s
PW自身就有根據IP判斷所屬地區的功能,只要經常更新IP庫就沒什麼問題.至於根據歸屬地跳轉到相應頁面就需要你自己去寫了。網上幫你找了一個,看是否合適。
。<?php
//返回當前IP的城市字串
function convertip($ip) {
//IP資料檔案路徑
$dat_path = "QQWry.Dat";
//檢查IP地址
if(!preg_match("/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/", $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(s