2

我想知道如果用户在美国,是否可以通过 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>';
}
?>
4

3 回答 3

1

有两种方法可以做到这一点,1.使用客户端ips过滤位置,

$deny = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {

如果客户端使用 VPN 或代理服务器访问您的应用程序,这将失败,

  1. 使用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; 
  }
于 2013-09-20T14:37:45.593 回答
0

您要么需要拥有世界上所有 ISP 的数据库(其中包含数千个 IP),要么需要使用诸如http://ipinfodb.com/ip_location_api.php之类的 API

另外,请记住,通过使用 Web 代理、HTTP 代理或 VPN 来伪造 IP 非常容易。你不能只信任一个IP。

对于代码部分,阅读他们的文档,一旦你得到他们的国家($country),就这样做(如果我理解正确的话):

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

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

于 2013-09-20T14:31:39.567 回答
0

您需要一个 GeoIP 数据库。有一大堆可用的——这是我从 google 得到的一个结果,但还有很多其他的;找到最适合您的(有些是免费的,有些需要付费;有些只有国家数据,有些有城镇数据;有些是在线 API,有些是可下载的数据库;有些比其他的更新;等等等等)。

你会遇到的问题是:

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

  • 通过 VPN 或使用代理服务器连接的用户会得到不正确的结果。您对此无能为力:您只需要接受可能在一个位置,而您的 IP 地址似乎在其他地方。

上面的信息是你可以做到,但不能保证正确,所以使用它,但不要依赖它

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

于 2013-09-20T14:33:58.817 回答