当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP根据IP地址判断城市实现城市切换或跳转代码

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-28 16:33:27 浏览: 评论:0 

先要获取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.     }//开源代码phpfensi.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.phpfensi.com/"

将开头的A段代码和上面的C段代码分别放在B段代码的头和尾,然后我们在需要跳转的页面加入以下代码:

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

刷新页面,是不是达到预想的效果了呢?

上面的代码只是简单的判断了ip那里就跳到那,如果出现如,我想把湖南所有IP都跳到长沙去,那像衡阳,刘阳,耒阳 这些就要作多次父线处理了.

Tags: PHP判断城市 PHP城市切换代码

分享到: