• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

     

    地理定位查詢主要可分為兩個步驟:第一,獲取待查詢的IP;第二,利用MaxMind? API進行查詢并返回查詢結果。本例中數據比較簡單,因此可以把查詢結果直接以Javascript字符串的形式返回給客戶端,用eval調用即可。下面將詳細介紹上述步驟。

    1.獲取待查詢的IP

    首先,在文件開始的部分引入MaxMind? API的庫文件。

    
    
    1. <?php 
    2. //導入庫文件  
    3. include("geoipcity.inc");  
    4. include("geoipregionvars.php")  
    5. ?> 

    如果未傳遞任何參數,則使用當前訪客的IP,如此就可以在加載的時候使用顯示當前訪客的信息了。代碼如下。

    
    
    1. //接上面程序  
    2. //獲取客戶端IP的函數  
    3. function getClientIP()  
    4. {  
    5.     if (isset($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]))  
    6.     {  
    7.         $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];  
    8.     }  
    9.     elseif (isset($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]))  
    10.     {  
    11.         $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];  
    12.     }  
    13.     elseif (isset($HTTP_SERVER_VARS["REMOTE_ADDR"]))  
    14.     {  
    15.         $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];  
    16.     }  
    17.     elseif (getenv("HTTP_X_FORWARDED_FOR"))  
    18.     {  
    19.         $ip = getenv("HTTP_X_FORWARDED_FOR");  
    20.     }  
    21.     elseif (getenv("HTTP_CLIENT_IP"))  
    22.     {  
    23.         $ip = getenv("HTTP_CLIENT_IP");  
    24.     }  
    25.     elseif (getenv("REMOTE_ADDR"))  
    26.     {  
    27.         $ip = getenv("REMOTE_ADDR");  
    28.     }  
    29.     else  
    30.     {  
    31.         $ip = false;  
    32.     }  
    33.     return $ip;  
    34. }  
    35.  
    36. //如果傳遞的查詢參數為空  
    37. if(empty($_GET['q']))  
    38. {  
    39.     $ip = getClientIP();  
    40.     if (!isset($ip))  
    41.     {  
    42.         echo 'alert("Cannot get your IP address!");';  
    43.         die();  
    44.     }  

    如果有參數傳遞,則判斷是否為IP或域名信息。如果都不是,報錯,終止查詢。代碼如下。

    
    
    1. //接上面程序  
    2. //如果傳遞的查詢參數不為空  
    3. else  
    4. {    //探測字符串是否為IP的正則表達式  
    5.     $pattern = "/^(\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])$/"
      ;  
    6.      
    7.     if(preg_match($pattern, $_GET['q']))        //如果查詢的信息為IP  
    8.     {  
    9.         $ip = $_GET['q'];  
    10.     }  
    11.     else     //如果查詢的信息為域名  
    12.     {  
    13.         $ip = gethostbyname($_GET['q']);        
      //若域名查詢成功,則返回的字符串為IP  
    14.         if(!preg_match($pattern, $ip))              
      //檢測是否返回IP,若未返回IP,即域名查詢失敗,報錯  
    15.         {  
    16.             echo 'alert("Invalid Input!"); ';  
    17.             die();  
    18.         }  
    19.     }  

    經過以上一系列處理,就可以從參數中獲取真實的IP用于查詢了。

    2.通過IP獲取地理信息

    利用MaxMind?取得某IP的地理信息是相對容易的,查詢的結果是一個結構體,包含國家代碼、國家名稱、城市名稱和城市經緯度等信息。下面對其中元素進行一一說明。

    country_code - 國家代碼(兩位),如中國為CN。

    country_code3 - 國家代碼(三位),如中國為CHN。

    country_name - 國家名稱(英文),如中國為China。

    region - 區域代碼,通過$GEOIP_REGION_NAME[$record->country_code] [$record->region]可獲得區域的名稱。對于中國,region得到的是省級行政區的名稱,如$GEOIP_REGION_NAME["CN"]["01"]對應的行政區即位Anhui(安徽)。

    city - 城市名稱。

    postal_code - 郵編,僅美國可用。

    latitude - 緯度。

    longitude - 經度。

    dma_code - DMA代碼,僅美國可用。

    area_code - 地區代碼,僅美國可用。

    了解數據的組織結構后就可以方便地使用其中的數據了。代碼如下:

    
    
    1. //接上面程序  
    2.  
    3. //如果取消下一行將使用共享內存打開GeoLiteCity數據庫,
      可加快查詢。但前提是服務器支持共享內存  
    4. //$gi = geoip_open("./GeoLiteCity.dat",GEOIP_MEMORY_CACHE);  
    5.  
    6. //以常規方式打開GeoLiteCity數據庫,一般情況下都可以使用  
    7. $gi = geoip_open("./GeoLiteCity.dat",GEOIP_STANDARD);  
    8.  
    9. //以上是假定GeoLiteCity數據庫和PHP文件在同一個目錄,
      故使用"./GeoLiteCity.dat"為路徑  
    10. //如果不是,請改為實際目錄  
    11.  
    12. //獲取IP的信息  
    13. $record = geoip_record_by_addr($gi, $ip);    
    14. //關閉數據庫  
    15. geoip_close($gi);  
    16.  
    17. //如果獲取了相關數據  
    18. if($record)  
    19. {  
    20.     echo 'loadGeoInfo('.  
    21.                '"'.   $_GET['q']   .'",'.          
      //原始查詢信息  
    22.                '"'.   $ip   .'",'.                      //被查IP  
    23.                '"'.   $record->country_code   
      .'",'.    //國家代碼(兩位)  
    24.                '"'.   $record->country_code3  
      .'",'.    //國家代碼(三位)  
    25.                '"'.   $record->country_name   
      .'",'.    //國家名稱  
    26.                '"'.   $GEOIP_REGION_NAME
      [$record-
      >country_code] [$record->region]   .'",'. 
      //地區名稱  
    27.                '"'.   $record->city   .'",'.       
      //城市名稱  
    28.                $record->latitude   .','.                //緯度  
    29.                $record->longitude   .')';               //經度  
    30.                                                
      //如果數據庫中不存在相關數據  
    31. else  
    32. {  
    33.     echo 'alert("The Information for '.$ip.' is not available now!"); ';  
    34. }  
    35. ?> 

    將以上代碼整合到一起,保存為search.php,放到本程序的主目錄中(search.php完整代碼在光盤中本章節目錄里可以找到)。

    在瀏覽器中輸入http://服務器地址/程序所在路徑/search.php?q=google.com,應該會顯示與下面信息類似的輸出結果。

    loadGeoInfo("google.com", "64.233.187.99", "US", "USA", "United States", "California", "Mountain View", 37.4192,-122.0574)

    而輸入http://服務器地址/程序所在路徑/search.php?q=202.114.64.139,則輸出應該和下面類似。

    loadGeoInfo("202.114.64.139", "202.114.64.139", "CN", "CHN", "China", "Hubei", "Wuhan" ,30.5833, 114.2667)

    穩定

    產品高可用性高并發

    貼心

    項目群及時溝通

    專業

    產品經理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質開發
    • 返回頂部
    9久久免费国产精品特黄| 日韩精品一二三区| 久久久精品2019中文字幕2020| 国产情侣大量精品视频| 精品一区精品二区| 日韩人妻无码一区二区三区99 | 8090成人午夜精品| 久久国产乱子伦免费精品| 国产精品拍天天在线| 99精品国产综合久久久久五月天| 精品久久久久久久久久久久久久久 | 亚洲人精品午夜射精日韩| 国产日韩精品一区二区在线观看| 苍井空亚洲精品AA片在线播放| 亚洲日韩精品A∨片无码加勒比| 99re热久久这里只有精品首页| 亚洲精品亚洲人成在线播放| 亚洲国产精品人久久电影| 精品亚洲aⅴ在线观看| 99re热精品视频国产免费| 99精品众筹模特自拍视频| 蜜臀久久99精品久久久久久小说| 久久无码专区国产精品| 久久精品成人无码观看56| 久久国产精品只做精品| 四虎国产精品永久免费网址| 国产成人vr精品a视频| 久久精品免费视频观看| 亚洲国产精品久久66| 日韩人妻无码精品一专区| 久久九九精品国产av片国产| 亚洲视频精品在线| 精品无码国产污污污免费网站| 久久无码国产专区精品| 亚洲精品视频观看| 国产精品自产拍在线观看| 久久91精品国产91| 国产精品乱码一区二区三| 精品久久久久久久免费人妻 | 日韩精品一区二区三区影院| 下载天堂国产AV成人无码精品网站 |