【问题标题】:Save Location to DB based on IP address根据 IP 地址将位置保存到数据库
【发布时间】: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,更不用说解析结果了,所以我改成上面的了。

【问题讨论】:

    标签: php file geolocation 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 的步骤:

    1. 在此处注册 API 密钥:http://ipinfodb.com/register.php。这将允许您从他们的服务器检索结果,否则它将无法工作。
    2. 您无需实现任何 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 的更多信息

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 2021-03-11
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多