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地址的最佳方法吗?

4

4 回答 4

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_ATONINET_NTOA可以轻松处理转换:

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

mysql> SELECT INET_NTOA(167773449);
        -> '10.0.5.9'
于 2012-06-12T07:11:29.013 回答
1

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

或者,这个任务有一个不错的库:http: //geocoder-php.org/

于 2012-06-12T07:26:25.173 回答
0

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

Maxmind 公司在 CreativeCommons 许可下免费提供了一个名为GeoLite的数据库

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;
于 2012-06-12T07:22:06.183 回答
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#)

于 2017-09-19T09:34:43.397 回答