【问题标题】:php country dropdown by maxmind geoipmaxmind geoip的php国家下拉列表
【发布时间】:2014-11-15 12:04:44
【问题描述】:

我想创建一个国家下拉菜单,可以根据他/她的 IP 地址预先选择用户国家。例如,如果用户在意大利,则必须首先显示意大利,同时将所有其他国家/地区保留在列表中。

我搜索了很多,我首先下载 Maxmind GeoIP API 和数据库。这是我尝试过的,它只显示一个正常的下拉列表,而没有通过 ip 预先选择国家:

  <select name="" multiple="multiple" width="200px" size="10px">
  <?php  

  require 'vendor/autoload.php'; //I put this is /var/www where my php file is  

  $gi = geoip_open('/usr/local/share/GeoIP/GeoIP.dat', GEOIP_STANDARD);
  $ip =  $_SERVER['REMOTE_ADDR'];
  echo $ip;
  $preselect_country = geoip_country_code_by_addr($gi, $ip);

  //newCountry.php is where I select all countries for drop down list
  include('newCountry.php');

  while ($line = mysql_fetch_array($result)) {

       if($preselect_country == $line){
         $selected = "selected";
     }else{
         $selected = "";
      }
  ?>

   <option value="<?php echo $line['country'];?>"<?php echo $selected; ?>><?php echo $line['country'];?> </option>;

  <?php
   }
  ?>
     geoip_close($gi);

 ?>
 </select>

我真的尽力自己找到解决方案,我阅读了所有这些类似的问题并尝试了其他解决方案,例如: Automatic Dropdown based on Country with GeopluginFetching the current country name using ip address in phpGet Country of IP Address with PHPGetting visitors country from their Ip 等等,但我不知道为什么它不起作用。 我尝试了这个有效的代码,所以我发现我可以获取 ip:

 $ip =  $_SERVER['REMOTE_ADDR']; 
  echo $ip;

这个样本也对我有用(输出是 ES 西班牙),

<?php

 require 'vendor/autoload.php';

 $gi = geoip_open("/usr/local/share/GeoIP/GeoIP.dat",GEOIP_STANDARD);

 echo geoip_country_code_by_addr($gi, "80.24.24.24") . "\t" .
 geoip_country_name_by_addr($gi, "80.24.24.24") . "\n";

 geoip_close($gi);

 ?>

但如果我尝试使用完全相同的代码,只是用 $ip 替换“80.24.24.24”,它不会返回任何内容!

#编辑: 好吧,感谢@vch,我发现问题与我的 ip 有关,因为它是针对私有网络的,所以我通过 ifconfig 获得了我的真实互联网 ip 并在我的代码中使用它,它运行良好。至此,我发现我安装的 geoip api 没有问题,并且下拉预选也运行良好。

这是新代码:

<select name = "question" class = "question" id = 'Question'> 
<?php

require 'vendor/autoload.php';

$gi = geoip_open('/usr/local/share/GeoIP/GeoIP.dat', GEOIP_STANDARD);
$ip = "131.175.122.222";

$preselect_country = geoip_country_name_by_addr($gi, $ip);  

include('newCountry.php');

while ($line = mysql_fetch_array($result)) {

   if($preselect_country == $line['country']){
       $selected = "selected";
   }else{
       $selected = "";
    }


 echo "<option value=\"{$line['country']}\" {$selected}>{$line['country']}</option>\n";
 }
   geoip_close($gi);

?>
</select>

现在我的问题是如何获取用户的真实互联网 IP,以防他们使用像我这样的私有网络?

高度赞赏所有想法,

谢谢,

【问题讨论】:

  • 首先,有没有试过开启error reporting?这总是一个很好的第一步。
  • @vch,我刚刚检查了 error.log ,我正在阅读你建议的链接。我会试试的
  • @vch:我在error.log中没有收到任何错误,我认为我的问题与这个ip有关:10.48.44.43(这是我通过运行$_SERVER['得到的ip REMOTE_ADDR'];) ,当我在任何获得 ip 并返回国家/地区的网站中输入此 IP 时,即使在这些网站中也不会返回任何内容!相反,他们向我展示了另一个 IP!我真的很困惑:(
  • 您是在本地网络上还是在 Internet 上尝试使用它?该 IP 范围看起来像一个专用网络。
  • @vch:嗯,我想是的,因为我通过 openvpn 连接到我的大学服务器.. 我应该知道什么?我怎样才能获得真实的IP?

标签: php drop-down-menu ip geoip maxmind


【解决方案1】:

尝试使用以下代码获取 IP,希望它会返回您的确切 IP。

$ip = getenv('HTTP_CLIENT_IP')?:
getenv('HTTP_X_FORWARDED_FOR')?:
getenv('HTTP_X_FORWARDED')?:
getenv('HTTP_FORWARDED_FOR')?:
getenv('HTTP_FORWARDED')?:
getenv('REMOTE_ADDR');

【讨论】:

  • 它也返回了私有 ip :(
  • @mOna 脚本无法知道您是否在使用 VPN。我觉得,您将无法使用 PHP 获得该 IP
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多