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

首頁 > 開發(fā) > PHP > 正文

php實(shí)現(xiàn)多城市切換特效

2024-05-04 23:38:40
字體:
供稿:網(wǎng)友

本文給大家主要分享的是在PHP中如何獲取用戶IP地址、PHP根據(jù)IP判斷用戶所在城市以及PHP根據(jù)IP實(shí)現(xiàn)城市切換或跳轉(zhuǎn)的問題。

我們先來看下個(gè)人常用的代碼

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,'玄武區(qū)')!==false){ 
  38. $city = "玄武區(qū)"
  39. else if(strpos($city,'仙林')!==false){ 
  40. $city = "仙林"
  41. else if(strpos($city,'秦淮區(qū)')!==false){ 
  42. $city = "秦淮區(qū)"
  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">玄武區(qū)</A></TD> 
  16. <TD><A href="show1.html">仙林</A></TD> 
  17. <TD><A href="show2.html">秦淮區(qū)</A></TD> 
  18. <TD><A href="show3.html">鼓樓</A></TD> 
  19. <TD><A href="show4.html">江寧</A></TD> 
  20. <TD><A href="show5.html">棲霞區(qū)</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">全部小區(qū)</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> 

另外附上網(wǎng)友的實(shí)現(xiàn)方法:

使用方法:解壓后QQWry.Dat就是我們想要IP地址數(shù)據(jù)庫,我們新建一個(gè)ipcity文件夾,將數(shù)據(jù)庫放在下面。QQ IP數(shù)據(jù)庫使用非常方便,數(shù)據(jù)也很齊全,你可以及時(shí)關(guān)注官方更新以保持?jǐn)?shù)據(jù)最新,強(qiáng)力推薦一下:)

接下來,我們在上面的ipcity目錄下新建一個(gè)ipaddress.php文件,直接復(fù)制以下代碼進(jìn)去即可,重要的地方也作了相應(yīng)注釋。B段:

 

 
  1. <? 
  2. /* 
  3. 函數(shù)名稱:ipCity 
  4. 參數(shù)說明:$userip——用戶IP地址 
  5. 函數(shù)功能:PHP通過IP地址判斷用戶所在城市 
  6. author:lee 
  7. contact:xpsem2010@gmail.com 
  8. */ 
  9. function ipCity($userip) { 
  10. //IP數(shù)據(jù)庫路徑,這里用的是QQ IP數(shù)據(jù)庫 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數(shù)據(jù)庫 
  22. if(!$fd = @fopen($dat_path'rb')){ 
  23. return 'IP data file not exists or access denied'
  24.  
  25.  
  26.  
  27. //explode函數(shù)分解IP地址,運(yùn)算得出整數(shù)形結(jié)果 
  28. $userip = explode('.'$userip); 
  29. $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3]; 
  30.  
  31.  
  32.  
  33. //獲取IP地址索引開始和結(jié)束位置 
  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個(gè)字節(jié) 
  56. fseek($fd$useripbegin + 7 * $Middle); 
  57. $useripData1 = fread($fd, 4); 
  58. if(strlen($useripData1) < 4) { 
  59. fclose($fd); 
  60. return 'File Error'
  61. //提取出來的數(shù)據(jù)轉(zhuǎn)換成長整形,如果數(shù)據(jù)是負(fù)數(shù)則加上2的32次冪 
  62. $userip1num = implode('', unpack('L'$useripData1)); 
  63. if($userip1num < 0) $userip1num += pow(2, 32); 
  64.  
  65.  
  66.  
  67. //提取的長整型數(shù)大于我們IP地址則修改結(jié)束位置進(jìn)行下一次循環(huán) 
  68. if($userip1num > $useripNum) { 
  69. $EndNum = $Middle
  70. continue
  71.  
  72.  
  73.  
  74. //取完上一個(gè)索引后取下一個(gè)索引 
  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地址對應(yīng)城市 
  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地址對應(yīng)的城市結(jié)果 
  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根據(jù)IP地址實(shí)現(xiàn)城市切換或跳轉(zhuǎn)

到這里,其實(shí)問題已經(jīng)很簡單了,用簡單的js就通通搞定。C段如下:

 

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

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

刷新頁面,是不是達(dá)到預(yù)想的效果了呢?

以上就是PHP獲取IP地址、PHP根據(jù)IP地址判斷城市以及PHP根據(jù)IP地址實(shí)現(xiàn)城市切換或跳轉(zhuǎn)的詳細(xì)介紹了,事實(shí)上,像PHP中通過IP地址自動(dòng)切換城市就是這個(gè)方法的典型應(yīng)用。舉一反三,我們通過這種方法,也可以實(shí)現(xiàn)屏蔽指定IP地址或城市的用戶訪問,自己研究一下吧,也挺簡單的:)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 田东县| 和政县| 临邑县| 夏河县| 泰州市| 荃湾区| 石楼县| 巴里| 渭源县| 随州市| 离岛区| 唐山市| 金华市| 芜湖市| 瓮安县| 老河口市| 仁怀市| 偃师市| 大港区| 墨脱县| 池州市| 改则县| 东乌珠穆沁旗| 辉南县| 丹寨县| 新乐市| 天津市| 赣州市| 岑巩县| 浦北县| 裕民县| 衡水市| 满城县| 长治县| 墨玉县| 钟山县| 竹北市| 靖江市| 普宁市| 鹤山市| 马公市|