根据 IP 地址将位置保存到数据库

Posted

技术标签:

【中文标题】根据 IP 地址将位置保存到数据库【英文标题】:Save Location to DB based on IP address 【发布时间】:2012-01-30 19:24:41 【问题描述】:

我正在尝试使用 hostip 根据 IP 地址保存到 DB 用户的一般区域/位置。但是我不确定如何解析我收到的输出中的数据。

    <?php
        $ip = $_SERVER['REMOTE_ADDR'];
        $data = json_decode(file_get_contents("http://api.hostip.info/get_html.php?ip=$ip")); //<-not sure how
        $country = $data['Country'];
        $city = $data['City']; 
    ?>

您可以在此处查看我是如何接收数据的: http://api.hostip.info/get_html.php?ip=00.0.00.00

另一个选择是在这里使用第一个答案(使用 ipinfodb):Getting location details from IP in PHP,但它甚至不显示任何数据,即使我尝试在 url 中插入我的 IP,更不用说解析结果了,所以我改成上面的了。

【问题讨论】:

【参考方案1】:

因此,根据ipinfodb,您必须注册一个 API 密钥。但是他们有一个API class,在你给protected $apiKey = '';你的API密钥之后,getCountry($host)会得到IP所在的国家。或者,如果您不想使用它,可以使用他们的 XML 或 JSON API。

更新 1

或者,如果这对您来说太难了,那么在其他服务的换行符 (\n) 上使用 explode 。或者,也许使用其他服务。

更新 2

您链接的问题中提到的geoPlugin 似乎不需要API 密钥。他们使用的代码是echo var_export(unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip)));

【讨论】:

好的,我现在试过了,但它仍然无法正常工作...我使用与上面相同的代码并进行了以下更改:$iplookup = "http://api.ipinfodb.com/v3/ip-city/?key=&lt;myapikey&gt;&amp;ip=$ip"; $data = json_decode(file_get_contents($iplookup)); $country = $data['CountryCode']; $city = $data['CityName']; 但我仍然没有得到数据.每个只有“O”和“O” 好的,我现在试过了,但还是不行……这是我正在使用的代码:$data = var_export(unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=$ip"))); $country = $data['geoplugin_countryCode']; $city = $data['geoplugin_city']; 这应该可以工作:$data = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=".$ip)); $country = $data['geoplugin_countryCode']; $city = $data['geoplugin_city'];(或者至少对我有用)。【参考方案2】:

简单地使用 $data['country'] 将不起作用,因为给定的结果不是对象或数组。您需要将内容拆分为一个数组,或者更好的是,将其作为 JSON 对象检索,然后使用:

$data = json_decode($data);

为您提供数组中的数据。

尽管如此,我不建议从 IP 地址获取位置,因为它非常不准确!它返回 Host 服务器的位置,不一定是用户的位置。

编辑:

使用 JSON API:http://ipinfodb.com/ip_location_api_json.php

更新:

实现 JSON API 的步骤:

    在此处注册 API 密钥:http://ipinfodb.com/register.php。这将允许您从他们的服务器检索结果,否则它将无法工作。 您无需实现任何 SDK 即可使其正常工作,因此您只需要以下内容:

复制并粘贴以下 PHP 代码:

// Set the parameters
$ip_address = $_SERVER['REMOTE_ADDR'];
$api_key = 'YOUR_API_KEY_HERE';

// Get the data
$data = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=$api_key&ip=$ip_address&format=json");

// Decode the JSON result into an array
$data = json_decode($data);

// All data can now be accessed using the associative array $data
$country = $data['Country']; // Country
$city = $data['City']; // City

【讨论】:

我不需要精确的位置,只需要区域,因此我现在使用 ip 作为位置 该地区的数据甚至都不准确。我的 IP 是曼彻斯特,我在 200 多英里之外! 太棒了!这对我们的目的来说非常棒。 好的,让我知道你如何处理上面的事情 我只是使用 geoplugin 完成的 - 见上文【参考方案3】:

你可以用换行符分割成一个数组,然后用一系列字符串操纵器擦洗它……或者你可以找到一个服务,将数据返回为 json,这将完全减轻经历的痛苦所有这些。

【讨论】:

a 部分:您可以显示/链接到示例代码吗? b 部分:请参阅我上面对 axiomer 的评论,我在那里得到了 json,但它仍然无法正常工作......【参考方案4】:

你可以像这样创建一个数组:

array(
   array(
        'ip' => '0.0.0.0',
        'country' => 'someplace',
        'city' => 'somecity'm ,
        'data' => 'somedata'),
     array(
        'ip' => '0.0.0.0',
        'country' => 'someplace',
        'city' => 'somecity'm ,
        'data' => 'somedata'),
.
.
. );

然后序列化数组并通过 ip 地址将其保存在数据库中,然后你就只有 2 个表列:

ip ::: info 

然后您可以使用函数从 db 中检索数据并将从 info 列检索到的数组通用化。有关 php serialze 的更多信息

【讨论】:

以上是关于根据 IP 地址将位置保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

laravel 4将IP地址保存到模型

如何使用 Spring 安全性将 IP 地址从经过身份验证的用户保存到数据库?

如何将IP地址保存在数据库中[关闭]

java根据ip地址获取相应的所在地,精确到街道和门牌号,要怎么实现?

通过网络请求获取当前IP,并得到大致位置

DNS域名解析系统_2