国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP根據IP地址判斷城市實現城市切換或跳轉代碼

2024-05-04 21:48:41
字體:
來源:轉載
供稿:網友

先要獲取ip地址相當簡單,下面先介紹兩種獲取IP地址的代碼,后面需要利用QQIP庫來查找當前IP是屬于那個IP段然后得出城市字段并返回.

獲取IP地址,代碼如下:

  1. <?php 
  2. function GetIP() { 
  3.     if ($_SERVER["HTTP_X_FORWARDED_FOR"]) 
  4.         $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
  5.     else if ($_SERVER["HTTP_CLIENT_IP"]) 
  6.         $ip = $_SERVER["HTTP_CLIENT_IP"]; 
  7.     else if ($_SERVER["REMOTE_ADDR"]) 
  8.         $ip = $_SERVER["REMOTE_ADDR"]; 
  9.     else if (getenv("HTTP_X_FORWARDED_FOR")) 
  10.         $ip = getenv("HTTP_X_FORWARDED_FOR"); 
  11.     else if (getenv("HTTP_CLIENT_IP")) 
  12.         $ip = getenv("HTTP_CLIENT_IP"); 
  13.     else if (getenv("REMOTE_ADDR")) 
  14.         $ip = getenv("REMOTE_ADDR"); 
  15.     else 
  16.         $ip = "Unknown"
  17.     return $ip
  18. echo GetIP(); 
  19. ?> 

方法二,代碼如下:

  1. function getip () 
  2.      if (getenv('http_client_ip')) { 
  3.       $ip = getenv('http_client_ip'); 
  4.      } else if (getenv('http_x_forwarded_for')) { 
  5.       $ip = getenv('http_x_forwarded_for'); 
  6.     } else if (getenv('remote_addr')) { 
  7.       $ip = getenv('remote_addr'); 
  8.     } else { 
  9.       $ip = $_server['remote_addr']; 
  10.     } 
  11. return $ip;  

PHP通過IP地址判斷用戶所在城市

上文已經獲得了用戶IP地址,接下來,我們就是根據這個IP地址獲得用戶所在城市了,開始之前,我們需要下載一個現成的數據庫QQ IP數據庫.

最新IP地址數據庫:http://8.zjdx2.crsky.com/201209/qqwry0830.rar

使用方法:解壓后QQWry.Dat就是我們想要IP地址數據庫,我們新建一個ipcity文件夾,將數據庫放在下面,QQ IP數據庫使用非常方便,數據也很齊全,你可以及時關注官方更新以保持數據最新,強力推薦一下.

接下來,我們在上面的ipcity目錄下新建一個ipaddress.php文件,直接復制以下代碼進去即可,重要的地方也作了相應注釋,代碼如下:

  1. <?php 
  2. /* 
  3. 函數名稱:ipCity 
  4. 參數說明:$userip——用戶IP地址 
  5. 函數功能:PHP通過IP地址判斷用戶所在城市 
  6. author:lee 
  7. contact:xpsem2010@gmail.com 
  8. */ 
  9. function ipCity($userip) { 
  10.     //IP數據庫路徑,這里用的是QQ IP數據庫 20110405 純真版 
  11.     $dat_path = 'QQWry.dat'
  12.  
  13.     //判斷IP地址是否有效 
  14.     if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$"$userip)){ 
  15.         return 'IP Address Invalid'
  16.     } 
  17.  
  18.     //打開IP數據庫 
  19.     if(!$fd = @fopen($dat_path'rb')){ 
  20.         return 'IP data file not exists or access denied'
  21.     } 
  22.  
  23.     //explode函數分解IP地址,運算得出整數形結果 
  24.     $userip = explode('.'$userip); 
  25.     $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3]; 
  26.  
  27.     //獲取IP地址索引開始和結束位置 
  28.     $DataBegin = fread($fd, 4); 
  29.     $DataEnd = fread($fd, 4); 
  30.     $useripbegin = implode('', unpack('L'$DataBegin)); 
  31.     if($useripbegin < 0) $useripbegin += pow(2, 32); 
  32.     $useripend = implode('', unpack('L'$DataEnd)); 
  33.     if($useripend < 0) $useripend += pow(2, 32); 
  34.     $useripAllNum = ($useripend - $useripbegin) / 7 + 1; 
  35.  
  36.     $BeginNum = 0; 
  37.     $EndNum = $useripAllNum
  38.  
  39.     //使用二分查找法從索引記錄中搜索匹配的IP地址記錄 
  40.     while($userip1num>$useripNum || $userip2num<$useripNum) { 
  41.         $Middleintval(($EndNum + $BeginNum) / 2); 
  42.  
  43.         //偏移指針到索引位置讀取4個字節 
  44.         fseek($fd$useripbegin + 7 * $Middle); 
  45.         $useripData1 = fread($fd, 4); 
  46.         if(strlen($useripData1) < 4) { 
  47.             fclose($fd); 
  48.             return 'File Error'
  49.         } 
  50.         //提取出來的數據轉換成長整形,如果數據是負數則加上2的32次冪 
  51.         $userip1num = implode('', unpack('L'$useripData1)); 
  52.         if($userip1num < 0) $userip1num += pow(2, 32); 
  53.  
  54.         //提取的長整型數大于我們IP地址則修改結束位置進行下一次循環 
  55.         if($userip1num > $useripNum) { 
  56.             $EndNum = $Middle
  57.             continue
  58.         } 
  59.  
  60.         //取完上一個索引后取下一個索引 
  61.         $DataSeek = fread($fd, 3); 
  62.         if(strlen($DataSeek) < 3) { 
  63.             fclose($fd); 
  64.             return 'File Error'
  65.         } 
  66.         $DataSeek = implode('', unpack('L'$DataSeek.chr(0))); 
  67.         fseek($fd$DataSeek); 
  68.         $useripData2 = fread($fd, 4); 
  69.         if(strlen($useripData2) < 4) { 
  70.             fclose($fd); 
  71.             return 'File Error'
  72.         } 
  73.         $userip2num = implode('', unpack('L'$useripData2)); 
  74.         if($userip2num < 0) $userip2num += pow(2, 32); 
  75.  
  76.         //找不到IP地址對應城市 
  77.         if($userip2num < $useripNum) { 
  78.             if($Middle == $BeginNum) { 
  79.                 fclose($fd); 
  80.                 return 'No Data'
  81.             } 
  82.             $BeginNum = $Middle
  83.         } 
  84.     } 
  85.  
  86.     $useripFlag = fread($fd, 1); 
  87.     if($useripFlag == chr(1)) { 
  88.         $useripSeek = fread($fd, 3); 
  89.         if(strlen($useripSeek) < 3) { 
  90.             fclose($fd); 
  91.             return 'System Error'
  92.         } 
  93.         $useripSeek = implode('', unpack('L'$useripSeek.chr(0))); 
  94.         fseek($fd$useripSeek); 
  95.         $useripFlag = fread($fd, 1); 
  96.     } 
  97.  
  98.     if($useripFlag == chr(2)) { 
  99.         $AddrSeek = fread($fd, 3); 
  100.         if(strlen($AddrSeek) < 3) { 
  101.             fclose($fd); 
  102.             return 'System Error'
  103.         } 
  104.         $useripFlag = fread($fd, 1); 
  105.         if($useripFlag == chr(2)) { 
  106.             $AddrSeek2 = fread($fd, 3); 
  107.             if(strlen($AddrSeek2) < 3) { 
  108.                 fclose($fd); 
  109.                 return 'System Error'
  110.             } 
  111.             $AddrSeek2 = implode('', unpack('L'$AddrSeek2.chr(0))); 
  112.             fseek($fd$AddrSeek2); 
  113.         } else { 
  114.             fseek($fd, -1, SEEK_CUR); 
  115.         } 
  116.  
  117.         while(($char = fread($fd, 1)) != chr(0)) 
  118.             $useripAddr2 .= $char
  119.  
  120.         $AddrSeek = implode('', unpack('L'$AddrSeek.chr(0))); 
  121.         fseek($fd$AddrSeek); 
  122.  
  123.         while(($char = fread($fd, 1)) != chr(0)) 
  124.             $useripAddr1 .= $char
  125.     } else { 
  126.         fseek($fd, -1, SEEK_CUR); 
  127.         while(($char = fread($fd, 1)) != chr(0)) 
  128.             $useripAddr1 .= $char
  129.  
  130.         $useripFlag = fread($fd, 1); 
  131.         if($useripFlag == chr(2)) { 
  132.             $AddrSeek2 = fread($fd, 3); 
  133.             if(strlen($AddrSeek2) < 3) { 
  134.                 fclose($fd); 
  135.                 return 'System Error'
  136.             } 
  137.             $AddrSeek2 = implode('', unpack('L'$AddrSeek2.chr(0))); 
  138.             fseek($fd$AddrSeek2); 
  139.         } else { 
  140.             fseek($fd, -1, SEEK_CUR); 
  141.         } 
  142.         while(($char = fread($fd, 1)) != chr(0)){ 
  143.             $useripAddr2 .= $char
  144.         } 
  145.     } 
  146.     fclose($fd); 
  147.  
  148.     //返回IP地址對應的城市結果 
  149.     if(preg_match('/http/i'$useripAddr2)) { 
  150.         $useripAddr2 = ''
  151.     } 
  152.     $useripaddr = "$useripAddr1 $useripAddr2"
  153.     $useripaddr = preg_replace('/CZ88.Net/is'''$useripaddr); 
  154.     $useripaddr = preg_replace('/^s*/is'''$useripaddr); 
  155.     $useripaddr = preg_replace('/s*$/is'''$useripaddr); 
  156.     if(preg_match('/http/i'$useripaddr) || $useripaddr == '') { 
  157.         $useripaddr = 'No Data'
  158.     }//開源代碼Vevb.com 
  159.  
  160.     return $useripaddr
  161. ?> 

PHP根據IP地址實現城市切換或跳轉,到這里,其實問題已經很簡單了,用簡單的js就通通搞定,C段如下:

  1. //根據IP地址跳轉指定頁面js取得城市 
  2. var city='<?echo ipCity($xp_UserIp);?>'
  3. //根據IP地址所有城市跳轉到指定頁面 
  4. if(city.indexOf("上海市")>=0){ 
  5.         window.location.href="http://shanghai.Vevb.com/"

將開頭的A段代碼和上面的C段代碼分別放在B段代碼的頭和尾,然后我們在需要跳轉的頁面加入以下代碼:

<script src="/ipcity/ipaddress.php" type="text/javascript" language="javascript"></script>

刷新頁面,是不是達到預想的效果了呢?

上面的代碼只是簡單的判斷了ip那里就跳到那,如果出現如,我想把湖南所有IP都跳到長沙去,那像衡陽,劉陽,耒陽 這些就要作多次父線處理了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桃园市| 民和| 姜堰市| 朔州市| 盐亭县| 友谊县| 石嘴山市| 洛川县| 连山| 台北市| 安吉县| 余江县| 临颍县| 鹤峰县| 云阳县| 汝南县| 桦南县| 固原市| 阿坝县| 金寨县| 景宁| 宁化县| 鹤壁市| 天气| 钟祥市| 岐山县| 松潘县| 陆川县| 循化| 东台市| 平邑县| 莲花县| 宁武县| 民和| 利津县| 酒泉市| 牡丹江市| 自治县| 鄂州市| 丽水市| 扬州市|