首页 > 开发 > PHP > 正文

php实现多城市切换特效

2024-05-04 23:38:40
字体:
来源:转载
供稿:网友

本文给大家主要分享的是在PHP中如何获取用户IP地址、PHP根据IP判断用户所在城市以及PHP根据IP实现城市切换或跳转的问题。

我们先来看下个人常用的代码

PHP

 

 
  1. <?php 
  2.  
  3.  
  4.  
  5. include_once('./qqwry.php'); 
  6. $QQWry=new QQWry;  
  7.  
  8. function get_real_ip(){ 
  9. $ip=false; 
  10. if(!emptyempty($_SERVER["HTTP_CLIENT_IP"])){ 
  11. $ip = $_SERVER["HTTP_CLIENT_IP"]; 
  12. if (!emptyempty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
  13. $ips = explode (", "$_SERVER['HTTP_X_FORWARDED_FOR']); 
  14. if ($ip) { array_unshift($ips$ip); $ip = FALSE; } 
  15. for ($i = 0; $i < count($ips); $i++) { 
  16. if (!eregi ("^(10|172/.16|192/.168)/."$ips[$i])) { 
  17. $ip = $ips[$i]; 
  18. break
  19. return $ip
  20.  
  21. function is_ip($str) { 
  22. $ip = explode("."$str); 
  23. if (count($ip)<4 || count($ip)>4) return 0; 
  24. foreach($ip as $ip_addr) { 
  25. if ( !is_numeric($ip_addr) ) return 0; 
  26. if ( $ip_addr<0 || $ip_addr>255 ) return 0; 
  27. return 1; 
  28.  
  29.  
  30. $ip=$_SERVER['REMOTE_ADDR'];  
  31. $ifErr=$QQWry->QQWry($ip);  
  32. $city = $QQWry->Country.$QQWry->Local; 
  33.  
  34. //echo $city;*/ 
  35.  
  36.  
  37. if (strpos($city,'玄武区')!==false){ 
  38. $city = "玄武区"
  39. else if(strpos($city,'仙林')!==false){ 
  40. $city = "仙林"
  41. else if(strpos($city,'秦淮区')!==false){ 
  42. $city = "秦淮区"
  43. else if(strpos($city,'江宁')!==false){ 
  44. $city = "江宁"
  45. else if(strpos($city,'鼓楼')!==false){ 
  46. $city = "鼓楼"
  47. else
  48. $city = "栖霞"
  49.  
  50.  
  51.  
  52. if (isset($_GET['chengshi'])) { //Ê×Ïȼì²âÊÇ·ñ»ñµÃÁË GET ´«µÝµÄÊý¾Ý  
  53. setcookie("cookie_city",$_GET['chengshi'],time()+3600*24); 
  54. $city = $_GET['chengshi'];  
  55. }  
  56. else if (isset($_COOKIE["cookie_city"])) { //¼ì²âÊÇ·ñ´æÔÚêdzÆCookie  
  57. $city = $_COOKIE["cookie_city"]; //ÏÔʾCookie±£´æµÄÊý¾Ý  
  58. }  
  59. else {  
  60. setcookie("cookie_city",$city,time()+3600*24); //´¿³õʼ»¯´Ë±äÁ¿  
  61. $_COOKIE["cookie_city"] = $city
  62. }  
  63. ?> 

HTML

 

 
  1. <!DOCTYPE html> 
  2. <html lang="zh-cn"> 
  3. <head> 
  4. <meta charset="utf-8"/> 
  5. <LINK href="css/css.css" type=text/css rel=stylesheet> 
  6. <SCRIPT src="js/jquery-1.4.2.min.js" type=text/javascript></SCRIPT> 
  7. <title>城市切换</title> 
  8. </head> 
  9. <BODY> 
  10. <DIV class=selCity id=allCity style="DISPLAY: none"> 
  11. <DIV class=area> 
  12. <TABLE> 
  13. <TBODY> 
  14. <TR> 
  15. <TD><A class=cur href="show.html">玄武区</A></TD> 
  16. <TD><A href="show1.html">仙林</A></TD> 
  17. <TD><A href="show2.html">秦淮区</A></TD> 
  18. <TD><A href="show3.html">鼓楼</A></TD> 
  19. <TD><A href="show4.html">江宁</A></TD> 
  20. <TD><A href="show5.html">栖霞区</A></TD> 
  21. </TR> 
  22. </TBODY></TABLE> 
  23. <DIV class=none><A id=foldin href="javascript:;">全部</A></DIV></DIV></DIV> 
  24. <DIV class=header> 
  25. <DIV class=area> 
  26. <DIV class=r> 
  27. <DIV class="topCtiy clear"> 
  28. <UL> 
  29.  
  30. <LI class=i1><A href="index.php">全部小区</A></LI> 
  31.  
  32. <LI class=i1> 
  33. <?php 
  34. echo $city;  
  35. ?> 
  36. </LI> 
  37. <LI class=i2 id=changeCity>切换城市</LI> 
  38. </UL> 
  39. </DIV> 
  40. </DIV> 
  41. </DIV> 
  42. </DIV> 
  43. <SCRIPT type=text/javascript> 
  44. jQuery(function(){ 
  45. $("#changeCity").click(function(a){ 
  46. $("#allCity").slideDown(300); 
  47. a.stopPropagation(); 
  48. $(this).blur(); 
  49. }); 
  50. $("#allCity").click(function(a){ 
  51. a.stopPropagation() 
  52. }); 
  53. $(document).click(function(a){ 
  54. a.button!=2 && $("#allCity").slideUp(300) 
  55. }); 
  56. $("#foldin").click(function(){ 
  57. $("#allCity").slideUp(300) 
  58. }); 
  59. }); 
  60. </SCRIPT> 
  61. </body> 
  62. </html> 

另外附上网友的实现方法:

使用方法:解压后QQWry.Dat就是我们想要IP地址数据库,我们新建一个ipcity文件夹,将数据库放在下面。QQ IP数据库使用非常方便,数据也很齐全,你可以及时关注官方更新以保持数据最新,强力推荐一下:)

接下来,我们在上面的ipcity目录下新建一个ipaddress.php文件,直接复制以下代码进去即可,重要的地方也作了相应注释。B段:

 

 
  1. <? 
  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.  
  14.  
  15. //判断IP地址是否有效 
  16. if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$"$userip)){ 
  17. return 'IP Address Invalid'
  18.  
  19.  
  20.  
  21. //打开IP数据库 
  22. if(!$fd = @fopen($dat_path'rb')){ 
  23. return 'IP data file not exists or access denied'
  24.  
  25.  
  26.  
  27. //explode函数分解IP地址,运算得出整数形结果 
  28. $userip = explode('.'$userip); 
  29. $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3]; 
  30.  
  31.  
  32.  
  33. //获取IP地址索引开始和结束位置 
  34. $DataBegin = fread($fd, 4); 
  35. $DataEnd = fread($fd, 4); 
  36. $useripbegin = implode('', unpack('L'$DataBegin)); 
  37. if($useripbegin < 0) $useripbegin += pow(2, 32); 
  38. $useripend = implode('', unpack('L'$DataEnd)); 
  39. if($useripend < 0) $useripend += pow(2, 32); 
  40. $useripAllNum = ($useripend - $useripbegin) / 7 + 1; 
  41.  
  42.  
  43.  
  44. $BeginNum = 0; 
  45. $EndNum = $useripAllNum
  46.  
  47.  
  48.  
  49. //使用二分查找法从索引记录中搜索匹配的IP地址记录 
  50. while($userip1num>$useripNum || $userip2num<$useripNum) { 
  51. $Middleintval(($EndNum + $BeginNum) / 2); 
  52.  
  53.  
  54.  
  55. //偏移指针到索引位置读取4个字节 
  56. fseek($fd$useripbegin + 7 * $Middle); 
  57. $useripData1 = fread($fd, 4); 
  58. if(strlen($useripData1) < 4) { 
  59. fclose($fd); 
  60. return 'File Error'
  61. //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂 
  62. $userip1num = implode('', unpack('L'$useripData1)); 
  63. if($userip1num < 0) $userip1num += pow(2, 32); 
  64.  
  65.  
  66.  
  67. //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环 
  68. if($userip1num > $useripNum) { 
  69. $EndNum = $Middle
  70. continue
  71.  
  72.  
  73.  
  74. //取完上一个索引后取下一个索引 
  75. $DataSeek = fread($fd, 3); 
  76. if(strlen($DataSeek) < 3) { 
  77. fclose($fd); 
  78. return 'File Error'
  79. $DataSeek = implode('', unpack('L'$DataSeek.chr(0))); 
  80. fseek($fd$DataSeek); 
  81. $useripData2 = fread($fd, 4); 
  82. if(strlen($useripData2) < 4) { 
  83. fclose($fd); 
  84. return 'File Error'
  85. $userip2num = implode('', unpack('L'$useripData2)); 
  86. if($userip2num < 0) $userip2num += pow(2, 32); 
  87.  
  88.  
  89.  
  90. //找不到IP地址对应城市 
  91. if($userip2num < $useripNum) { 
  92. if($Middle == $BeginNum) { 
  93. fclose($fd); 
  94. return 'No Data'
  95. $BeginNum = $Middle
  96.  
  97.  
  98.  
  99. $useripFlag = fread($fd, 1); 
  100. if($useripFlag == chr(1)) { 
  101. $useripSeek = fread($fd, 3); 
  102. if(strlen($useripSeek) < 3) { 
  103. fclose($fd); 
  104. return 'System Error'
  105. $useripSeek = implode('', unpack('L'$useripSeek.chr(0))); 
  106. fseek($fd$useripSeek); 
  107. $useripFlag = fread($fd, 1); 
  108.  
  109.  
  110.  
  111. if($useripFlag == chr(2)) { 
  112. $AddrSeek = fread($fd, 3); 
  113. if(strlen($AddrSeek) < 3) { 
  114. fclose($fd); 
  115. return 'System Error'
  116. $useripFlag = fread($fd, 1); 
  117. if($useripFlag == chr(2)) { 
  118. $AddrSeek2 = fread($fd, 3); 
  119. if(strlen($AddrSeek2) < 3) { 
  120. fclose($fd); 
  121. return 'System Error'
  122. $AddrSeek2 = implode('', unpack('L'$AddrSeek2.chr(0))); 
  123. fseek($fd$AddrSeek2); 
  124. else { 
  125. fseek($fd, -1, SEEK_CUR); 
  126.  
  127.  
  128.  
  129. while(($char = fread($fd, 1)) != chr(0)) 
  130. $useripAddr2 .= $char
  131.  
  132.  
  133.  
  134. $AddrSeek = implode('', unpack('L'$AddrSeek.chr(0))); 
  135. fseek($fd$AddrSeek); 
  136.  
  137.  
  138.  
  139. while(($char = fread($fd, 1)) != chr(0)) 
  140. $useripAddr1 .= $char
  141. else { 
  142. fseek($fd, -1, SEEK_CUR); 
  143. while(($char = fread($fd, 1)) != chr(0)) 
  144. $useripAddr1 .= $char
  145.  
  146.  
  147.  
  148. $useripFlag = fread($fd, 1); 
  149. if($useripFlag == chr(2)) { 
  150. $AddrSeek2 = fread($fd, 3); 
  151. if(strlen($AddrSeek2) < 3) { 
  152. fclose($fd); 
  153. return 'System Error'
  154. $AddrSeek2 = implode('', unpack('L'$AddrSeek2.chr(0))); 
  155. fseek($fd$AddrSeek2); 
  156. else { 
  157. fseek($fd, -1, SEEK_CUR); 
  158. while(($char = fread($fd, 1)) != chr(0)){ 
  159. $useripAddr2 .= $char
  160. fclose($fd); 
  161.  
  162.  
  163.  
  164. //返回IP地址对应的城市结果 
  165. if(preg_match('/http/i'$useripAddr2)) { 
  166. $useripAddr2 = ''
  167. $useripaddr = "$useripAddr1 $useripAddr2"
  168. $useripaddr = preg_replace('/CZ88.Net/is'''$useripaddr); 
  169. $useripaddr = preg_replace('/^s*/is'''$useripaddr); 
  170. $useripaddr = preg_replace('/s*$/is'''$useripaddr); 
  171. if(preg_match('/http/i'$useripaddr) || $useripaddr == '') { 
  172. $useripaddr = 'No Data'
  173.  
  174.  
  175.  
  176. return $useripaddr
  177. ?> 

PHP根据IP地址实现城市切换或跳转

到这里,其实问题已经很简单了,用简单的js就通通搞定。C段如下:

 

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

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

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

以上就是PHP获取IP地址、PHP根据IP地址判断城市以及PHP根据IP地址实现城市切换或跳转的详细介绍了,事实上,像PHP中通过IP地址自动切换城市就是这个方法的典型应用。举一反三,我们通过这种方法,也可以实现屏蔽指定IP地址或城市的用户访问,自己研究一下吧,也挺简单的:)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表