根据IP地址将位置保存到DB

时间:2012-01-30 19:24:42

标签: php file geolocation ip

我正在尝试使用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,但它甚至不显示任何数据,即使我尝试在网址中插入我的IP,更不用说解析结果了,所以我改变了上面的内容。

4 个答案:

答案 0 :(得分:5)

因此,根据ipinfodb,您必须注册API密钥。但他们有API classgetCountry($host)在您提供{1}} API密钥后会获得IP的国家/地区。或者,如果您不想使用它,您可以使用他们的XML或他们的JSON API。

更新1

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

更新2

似乎您链接的问题中提到的geoPlugin不需要API密钥。他们使用的代码是protected $apiKey = '';

答案 1 :(得分:1)

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

$data = json_decode($data);

为您提供数组中的数据。

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

修改

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

<强>更新

实施JSON API的步骤:

  1. 在此处注册API密钥:http://ipinfodb.com/register.php。这将允许您从他们的服务器检索结果,如果没有它将无法工作。
  2. 您无需实施任何SDK即可实现此功能,因此您只需要:
  3. 复制并通过以下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
    

答案 2 :(得分:0)

你可以拆分成一个带换行符分隔符的数组,然后用一系列字符串操纵器擦除它......或者你可以找到一个将数据作为json返回的服务,这将完全缓解经历的痛苦所有这些。

答案 3 :(得分:0)

你可以制作这样的数组:

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的更多信息