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

     

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

    1.獲取待查詢(xún)的IP

    首先,在文件開(kāi)始的部分引入MaxMind? API的庫(kù)文件。

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

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

    
    
    1. //接上面程序  
    2. //獲取客戶(hù)端IP的函數(shù)  
    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. //如果傳遞的查詢(xún)參數(shù)為空  
    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.     }  

    如果有參數(shù)傳遞,則判斷是否為IP或域名信息。如果都不是,報(bào)錯(cuò),終止查詢(xún)。代碼如下。

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

    經(jīng)過(guò)以上一系列處理,就可以從參數(shù)中獲取真實(shí)的IP用于查詢(xún)了。

    2.通過(guò)IP獲取地理信息

    利用MaxMind?取得某IP的地理信息是相對(duì)容易的,查詢(xún)的結(jié)果是一個(gè)結(jié)構(gòu)體,包含國(guó)家代碼、國(guó)家名稱(chēng)、城市名稱(chēng)和城市經(jīng)緯度等信息。下面對(duì)其中元素進(jìn)行一一說(shuō)明。

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

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

    country_name - 國(guó)家名稱(chēng)(英文),如中國(guó)為China。

    region - 區(qū)域代碼,通過(guò)$GEOIP_REGION_NAME[$record->country_code] [$record->region]可獲得區(qū)域的名稱(chēng)。對(duì)于中國(guó),region得到的是省級(jí)行政區(qū)的名稱(chēng),如$GEOIP_REGION_NAME["CN"]["01"]對(duì)應(yīng)的行政區(qū)即位Anhui(安徽)。

    city - 城市名稱(chēng)。

    postal_code - 郵編,僅美國(guó)可用。

    latitude - 緯度。

    longitude - 經(jīng)度。

    dma_code - DMA代碼,僅美國(guó)可用。

    area_code - 地區(qū)代碼,僅美國(guó)可用。

    了解數(shù)據(jù)的組織結(jié)構(gòu)后就可以方便地使用其中的數(shù)據(jù)了。代碼如下:

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

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

    在瀏覽器中輸入http://服務(wù)器地址/程序所在路徑/search.php?q=google.com,應(yīng)該會(huì)顯示與下面信息類(lèi)似的輸出結(jié)果。

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

    而輸入http://服務(wù)器地址/程序所在路徑/search.php?q=202.114.64.139,則輸出應(yīng)該和下面類(lèi)似。

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

    穩(wěn)定

    產(chǎn)品高可用性高并發(fā)

    貼心

    項(xiàng)目群及時(shí)溝通

    專(zhuān)業(yè)

    產(chǎn)品經(jīng)理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽(yù)

    堅(jiān)持

    10年專(zhuān)注高端品質(zhì)開(kāi)發(fā)
    • 返回頂部
    久久精品国产亚洲av成人| 狠狠精品久久久无码中文字幕| 日韩一级在线视频| 在线观看精品视频看看播放| 热久久这里是精品6免费观看| 热久久综合这里只有精品电影| 久久精品动漫一区二区三区| 中文国产成人精品少久久| 国产精品宅男在线观看| 国产精品igao视频网| 99re6在线精品免费观看| 亚洲日韩中文在线精品第一| 日韩在线视频不卡| 亚洲av日韩av无码av| 亚洲日韩国产精品乱-久| 99热这就是里面只有精品| 惠民福利中文字幕人妻无码乱精品 | 精品人妻一区二区三区四区在线| 日本娇小videos精品| 91精品国产手机| 99久久久国产精品免费牛牛| 少妇精品久久久一区二区三区| 久久精品国产大片免费观看| 亚洲国产另类久久久精品| 国产精品99精品无码视亚| 亚洲国产精品无码一线岛国| 国语自产拍精品香蕉在线播放| 日韩一区二区免费视频| 亚洲日韩一区精品射精| 日韩电影免费在线| 色老成人精品视频在线观看| 四虎国产精品成人| 亚洲精品成人片在线观看| 国产精品无码专区在线观看| 精品成人av一区二区三区| 久久久精品人妻无码专区不卡| 日韩在线观看免费| 中文字幕无码日韩专区| 久9视频这里只有精品8| 精品久久久久久无码人妻中文字幕 | 日韩美女在线观看一区|