日本在线免费播放,国产精品合集一区二区三区,亚洲国产欧美精品,久久青青草原精品国产不卡

 

地理定位查詢主要可分為兩個步驟:第一,獲取待查詢的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年專注高端品質開發
  • 返回頂部