按IP地址识别用户的位置

xan*_*xan 2 php sql ip geolocation

我正在编写一个程序,我希望自动识别用户的国家/地区.我编写了代码来获取ip并将其存储在DB中.

$ip = gethostbyname($_SERVER['REMOTE_ADDR']);
Run Code Online (Sandbox Code Playgroud)

储存:

 <?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())");` ?>
Run Code Online (Sandbox Code Playgroud)

另外,这是存储IP地址的最佳方法吗?

ale*_*exn 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"
}
Run Code Online (Sandbox Code Playgroud)

请注意,IP地理定位不会100%准确.


存储IP地址的最佳列类型INT(10) unsigned占用的空间比varchar列少.使用INET_ATONINET_NTOA可以轻松处理转换:

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

mysql> SELECT INET_NTOA(167773449);
        -> '10.0.5.9'
Run Code Online (Sandbox Code Playgroud)