Php 识别用户';按IP地址列出的用户位置

Php 识别用户';按IP地址列出的用户位置,php,sql,geolocation,ip,Php,Sql,Geolocation,Ip,我在写一个程序,希望自动识别用户的国家。我编写了获取ip并将其存储在DB中的代码 $ip = gethostbyname($_SERVER['REMOTE_ADDR']); 存储: <?php `$result = mysql_query("INSERT INTO `wh_order` (`name`, `email`, `contact`, `itemid`, `itemquantity`, `ip`,`message`, `date`) VALUES('".$name."','".

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

$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())");` ?>

首先,gethostbyname不会提供国家/地区。你必须求助于地理定位。一个有效的免费服务是可以的。它们提供了一个API:

返回:

{
    "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列占用更少的空间。转换很容易处理,并且:


通过IP识别用户的位置称为。它通常需要一个将IP地址范围映射到地理位置的数据库

Maxmind公司根据CreativeCommons许可证免费提供这样一个数据库

GeoLite数据库根据知识共享协议获得许可 3.0未移植的许可证。商业许可证是 可用

他们有一个允许快速查找IP的apache模块,然而,最简单的入门方法可能是纯PHP选项。查看

下载存档包括几个示例,基本过程非常简单:

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

你可以使用maxmind的数据库(http://www.maxmind.com/app/country)与apache或nginx扩展结合使用

或者,有一个很好的库用于此任务:

使用支持IPV4和IPV6地址的服务来定位ip的地理位置

  • JSON:
  • JSONP:
例如:


GEOIP DB-通过IP进行地理定位
国家:
声明:
城市:
纬度:
经度:
知识产权:
$.ajax({
url:“https://geoip-db.com/jsonp",
jsonpCallback:“回调”,
数据类型:“jsonp”,
成功:功能(位置){
$('#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);
}
});     

这是一个jquery代码片段,尽管在他们的网站上可以找到其他示例(纯javascript、php、C#)

仅通过存储用户的ip,您如何识别位置?有各种API可以尝试从ip中建议一个国家,但这并不可靠,因为它并不总是准确的,用户ip可能被阻止,或者他们可能正在使用VPN。根据您的需要,您可以查看它们的设置区域设置,但是这也有相同的问题。这是一个最好的猜测。将ip地址存储为int:$\u服务器['REMOTE\u ADDR']本身提供ip地址。您需要从Maxmind安装GeoIP之类的东西,才能从IP地址获取国家代码。@Matthew INET_ATON/INET_NTOA目前不支持IPv6。但是,您可以使用phps inet\u pton来完成此操作。谢谢。但我不明白“内特阿顿”那部分。你能详细说明一下吗?我是新来的。谢谢。@user1445759当然可以。插入IP时使用INET\u ATON:
插入表(国家,IP)值('US',INET\u ATON('10.0.5.9');
。选择时使用INET\u NTOA:
选择国家,INET\u NTOA(IP)从表中;
。有意义吗?好的。有意义。类似于加密-解密类型。谢谢。freegeoip.net听起来不错,但不知道。不过,他们停止更新IP数据库,因为IPInfoDB不再免费。“数据库上次更新是在2011年4月29日。”
$gi = geoip_open("GeoLite.dat", GEOIP_STANDARD);
$record = geoip_record_by_addr($gi, "24.24.24.24");
echo $record->latitude;
echo $record->longitude;
<!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>