Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将特定PHP仅限于美国IP_Php - Fatal编程技术网

如何将特定PHP仅限于美国IP

如何将特定PHP仅限于美国IP,php,Php,我想知道,如果用户在美国,是否可以通过PHP只执行特定的PHP行。我想包括一个超过100美元的美国订单免费送货图形,但如果用户是加拿大人,我不想让这个显示出来 这就是我的工作 <?php if ($_product->getPrice() > 100) { echo '<span class="shippinginfo">Free Shipping</span>'; } else { echo '<spa

我想知道,如果用户在美国,是否可以通过PHP只执行特定的PHP行。我想包括一个超过100美元的美国订单免费送货图形,但如果用户是加拿大人,我不想让这个显示出来

这就是我的工作

  <?php
            if ($_product->getPrice() > 100)
{
echo '<span class="shippinginfo">Free Shipping</span>';
}    
else
{
    echo '<span class="shippinginfo">Flat Rate $5.95</span>';
}
?>

您要么需要有一个世界上所有ISP的数据库(包含数千个IP),要么需要使用API,如

另外,请记住,通过使用web代理、HTTP代理或VPN,很容易伪造IP。你不能只相信IP

对于代码部分,请阅读他们的文档,一旦您了解了他们的国家(
$country
),请执行以下操作(如果我理解正确):



我建议您使用API,但是如果您想遇到挑战(或者如果您确实拥有大量的流量),您可以下载一个数据库,例如从中下载的数据库,然后自己进行IP到国家/地区的转换。请记住,即使用户似乎拥有美国IP,您也永远无法100%确定用户来自美国。

您需要一个GeoIP数据库。这里有一大堆,但还有很多其他的;找一个最适合你的(有些是免费的,有些是你必须付费的;有些只有国家数据,有些有城镇数据;有些是在线API,有些是可下载的数据库;有些是最新的,等等)

您将遇到的问题有:

  • 使数据保持最新--IP地址不绑定到给定位置。数据库依赖于有关每个地址块的所有权以及该所有者(即本地ISP)使用它的位置的数据。IP地址确实经常更改所有权和位置,如果您不保持数据库的最新状态,您的数据库很快就会给出错误的结果。即使是最新的数据库也可能是错误的;IP的位置没有正式发布,因此数据库维护人员必须手动跟踪更改。他们错过一些并不罕见

  • 通过VPN或使用代理服务器连接的用户将得到错误的结果。对此您无能为力:您只需接受这样一个事实:您的IP地址可能位于某个位置,而您的IP地址似乎位于其他位置

上面的信息是,您可以这样做,但不能保证它是正确的,因此请使用它,但不要依赖它


因此,您应该为您的用户提供一种绕过它的方法,并手动指定他们的国家。

有两种方法可以做到这一点, 1.使用客户端IP筛选位置

$deny = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
如果客户端使用VPN或代理服务器访问您的应用程序,则此操作将失败

  • 使用java脚本查找客户端位置,并将纬度和经度值传递给服务器,使用PHP查找客户端的地理位置
  • 如果客户端浏览器未启用/不允许位置信息,则此操作将失败

    function getLocation()
      {
      if (navigator.geolocation)
        {
        navigator.geolocation.getCurrentPosition(showPosition);
        }
      else{x.innerHTML="Geolocation is not supported by this browser.";}
      }
    function showPosition(position)
      {
      x.innerHTML="Latitude: " + position.coords.latitude + 
      "<br>Longitude: " + position.coords.longitude; 
      }
    
    函数getLocation() { if(导航器.地理位置) { navigator.geolocation.getCurrentPosition(showPosition); } else{x.innerHTML=“此浏览器不支持地理位置。”;} } 功能显示位置(位置) { x、 innerHTML=“纬度:”+position.coords.Latitude+ “
    经度:”+position.coords.Longitude; }
    您计划如何处理VPN、代理服务器等?获取具有发货地址的国家/地区不是更好吗?从哪里订购有什么关系?你应该根据船运地址来决定船运。如果地址在美国,那么你可以弹出免费送货通知。考虑一个美国人在他们在另一个国家的道路上订购东西的情况,但是想要把货物运到他们的家里。如果你在做基于IPs的免费送货,你现在已经把它们撕掉了。我不知道为什么这会被否决?菲尔问了一个可以回答的合法问题。嘿,菲尔,添加一个问号,这将使它成为一个合法的问题,哈哈。是的,我应该根据地址来决定发货,但是,客户在结账过程的第二级之前不会输入他们的地址。在这一点上,我不相信我的免费送货价值主张有多大分量。我正在使用Magento,所以理想情况下,我会为加拿大用户建立一个商店,但我正在寻找一个更简单、更省时的解决方案。你永远不应该依赖Javascript进行购买。你知道伪造地理位置有多容易吗?我能用以地理位置为起点的If-ELSE来嵌套这两个解决方案吗?
    function getLocation()
      {
      if (navigator.geolocation)
        {
        navigator.geolocation.getCurrentPosition(showPosition);
        }
      else{x.innerHTML="Geolocation is not supported by this browser.";}
      }
    function showPosition(position)
      {
      x.innerHTML="Latitude: " + position.coords.latitude + 
      "<br>Longitude: " + position.coords.longitude; 
      }