根据 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=<myapikey>&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 地址将位置保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring 安全性将 IP 地址从经过身份验证的用户保存到数据库?