2012-06-12 70 views
2

我正在編寫一個程序,我希望自動識別用戶的國家。我編寫了一些代碼,將這些代碼存儲在數據庫中。通過IP地址識別用戶的位置

$ip = gethostbyname($_SERVER['REMOTE_ADDR']); 

存儲:

<?php `$result = mysql_query("INSERT INTO `wh_order` (`name`, `email`, `contact`, `itemid`, `itemquantity`, `ip`,`message`, `date`) VALUES('".$name."','".$email."','".$contact."','".$itemid."','".$itemquantity."','".$ip."','".$message."', NOW())");` ?> 

此外,該存儲IP地址的最佳方法是什麼?

+0

只需通過存儲用戶的ip你如何識別位置? – Leri

+0

有各種API可以嘗試並從IP建議國家,但這是不可靠的,因爲它並不總是準確的,並且用戶IP可能被阻止,或者他們可能使用VPN。根據你的需要,你可以看看他們設置的區域,但是這有相同的問題。這將是一個最好的猜測。 –

+0

將IP地址存儲爲int:http://daipratt.co.uk/mysql-store-ip-address/ – Nanne

回答

7

首先,gethostbyname不會給你一個國家。你必須訴諸地理定位。一個免費的服務正常工作是http://freegeoip.net。他們提供了一個API:

http://freegeoip.net/json/74.125.143.104

將返回:

{ 
    "city": "Mountain View", 
    "region_code": "CA", 
    "region_name": "California", 
    "metrocode": "807", 
    "zipcode": "94043", 
    "longitude": "-122.057", 
    "latitude": "37.4192", 
    "country_code": "US", 
    "ip": "74.125.227.136", 
    "country_name": "United States" 
} 

注意地理位置的IP不會是100%準確。


最好柱類型存儲一個IP地址是INT(10) unsigned,這將佔用比varchar列更少的空間。轉換很容易與​​和INET_NTOA處理:

mysql> SELECT INET_ATON('10.0.5.9'); 
     -> 167773449 

mysql> SELECT INET_NTOA(167773449); 
     -> '10.0.5.9' 
+1

IPv6怎麼樣? –

+0

@MatthewRiches INET_ATON/INET_NTOA目前不支持IPv6。不過,你可以使用phps inet_pton來做到這一點。 – alexn

+0

謝謝。但我沒有理解「INET_ATON」部分。你能詳細說明嗎?我對此很陌生。謝謝。 – xan

0

通過其IP裏識別用戶的位置被稱爲Geolocation。它通常需要一個將IP地址範圍映射到地理位置的數據庫。

該公司的MaxMind提供下一個項目Creativecommons許可

GEOLITE上數據庫在知識共享署名 ,共享3.0 Unported許可協議進行許可這樣叫0​​一個免費的數據庫。商業許可證是 可用。

他們有一個允許快速IP查找的apache模塊,但是,最簡單的入門方法可能是純PHP選項。退房list of possible integration methods.

下載檔案包括幾個例子中,基本過程是相當簡單:

$gi = geoip_open("GeoLite.dat", GEOIP_STANDARD); 
$record = geoip_record_by_addr($gi, "24.24.24.24"); 
echo $record->latitude; 
echo $record->longitude; 
1

你可以使用的MaxMind的數據庫(http://www.maxmind.com/app/country )結合使用apache或nginx擴展。

另外,對於這個任務一個很好的圖書館:http://geocoder-php.org/

0

使用的https://geoip-db.com服務他們支持IPv4和IPv6地址來定位一個IP的地理位置。

實施例:

<!DOCTYPE html> 
<html> 
<head> 
    <title>GEOIP DB - Geolocation by IP</title> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"> 
    </script> 
</head> 
<body> 
    <div>Country: <span id="country"></span> 
    <div>State: <span id="state"></span> 
    <div>City: <span id="city"></span> 
    <div>Latitude: <span id="latitude"></span> 
    <div>Longitude: <span id="longitude"></span> 
    <div>IP: <span id="ip"></span> 
    <script> 
     $.ajax({ 
      url: "https://geoip-db.com/jsonp", 
      jsonpCallback: "callback", 
      dataType: "jsonp", 
      success: function(location) { 
       $('#country').html(location.country_name); 
       $('#state').html(location.state); 
       $('#city').html(location.city); 
       $('#latitude').html(location.latitude); 
       $('#longitude').html(location.longitude); 
       $('#ip').html(location.IPv4); 
      } 
     });  
    </script> 
</body> 
</html> 

這是一個jquery片斷,(普通的JavaScript儘管其它實例可以在他們的網站上找到, PHP,C#)