如何在PHP中跟踪用户位置/区域

时间:2010-10-14 08:46:00

标签: php geolocation ip-address currency region

我正在尝试获取用户浏览网站的国家/地区,以便我可以找出要在网站上显示的货币。我尝试使用以下版本提供的GET脚本:http://api.hostip.info但是我在测试时只返回XX。

如果有人知道更好的方法,请分享。

感谢。

6 个答案:

答案 0 :(得分:3)

我用这个:

  $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  $ip = $_SESSION['ip'];
  $try1 = "http://ipinfodb.com/ip_query.php?ip=".$ip."&output=xml";
  $try2 = "http://backup.ipinfodb.com/ip_query.php?ip=".$ip."&output=xml";
  $XML = @simplexml_load_file($try1,NULL,TRUE);
  if(!$XML) { $XML = @simplexml_load_file($try2,NULL,TRUE); }
  if(!$XML) { return false; }

  //Retrieve location, set time
  if($XML->City=="") { $loc = "Localhost / Unknown"; }
  else { $loc = $XML->City.", ".$XML->RegionName.", ".$XML->CountryName; }
  $_SESSION['loc'] = $loc;

答案 1 :(得分:1)

试试这些:

http://ip-to-country.webhosting.info/

http://www.ip2location.com/

两者都是IP地址到国家/地区的数据库,它们允许您查找给定IP地址的来源国。

但重要的是要注意这些数据库不是100%准确。他们是一个很好的指导,但由于各种原因,你会得到错误的结果。

  • 许多人使用代理来绕过特定国家/地区的块和过滤器。
  • 许多IP范围分配给地理分布广泛的公司;你会得到他们所在的国家,而不是真正的机器所在的地方(这一直是跟踪AOL用户的一个大问题,因为他们都显然住在弗吉尼亚州)
  • IP范围的控制有时会在国家/地区之间传输,因此您可能会得到错误的结果(特别是对于规模较小/联系较少的国家/地区)

保持数据库最新将缓解其中一些问题,但不会完全解决它们(特别是代理问题),所以你应该总是考虑到你会得到错误的结果。

答案 2 :(得分:0)

您应该使用geoip library

Maxmind提供免费的数据库和商业数据库,上次更新和精确的日期不同,商业质量更高。

有关免费数据库,请参阅http://www.maxmind.com/app/geolitecountry

我认为它应该足以满足基本需求。

答案 3 :(得分:0)

您可以使用Geolocation来获取坐标,然后使用一些服务从中获取国家/地区,但地理位置API是基于浏览器的,因此您只能通过JavaScript访问它,然后必须以某种方式将theese信息传递给PHP,我写道JS部分上的一些东西:

http://www.lautr.com/utilizing-html5-geolocation-api-and-yahoo-placefinder-example

当谈到通过IP获取位置时,那里有大量的服务提供数据库,一些免费,一些用于收费,一些有大量IP存储和大量数据,一些少用,例如你提到的那个,效果很好:

http://api.hostip.info/?ip=192.0.32.10

所以你可以使用非常简洁的Geolocation API,但需要用户权限,通过JS工作并且在IE中无法工作(到目前为止)或者必须寻找适合您需求的IPÜ位置服务:)

答案 4 :(得分:0)

试试这些:

$键=" 9dcde915a1a065fbaf14165f00fcc0461b8d0a6b43889614e8acdb8343e2cf15&#34 ;; $ ip =" 198.168.1230.122&#34 ;;

$ url =" http://api.ipinfodb.com/v3/ip-city/?key= $ key& ip = $ ip& format = xml";

//加载xml文件

$ xml = simplexml_load_file($ url); //打印第一个元素的名称

echo $ xml-> getName()。 "
&#34 ;; //创建一个循环来打印每个节点的元素名称和数据

foreach($ xml-> children()为$ child)

{

echo $child->getName() . ": " . $child . "<br />";

}

答案 5 :(得分:0)

如前所述,有许多方法可以做到这一点。但我建议你看一下我们开发的https://github.com/ip2iq/ip2-lib-php提供的IP2 PHP库。

您可以像下面这样使用它:

<?php
    require_once("Ip2.php");

    $ip2 = new \ip2iq\Ip2();
    $country_code = $ip2->country('8.8.8.8');
    //$country_code === 'US'
?>

它不需要任何SQL或Web服务查找只是本地数据文件。它比几乎所有其他方法都要快。数据库每月更新,您可以免费下载。

如果您需要使用您的语言的国家/地区名称,那么您现在唯一需要做的就是将其映射到关联数组中,例如https://gist.github.com/DHS/1340150