0

我想创建一个国家下拉列表,可以根据他/她的 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>

我真的尽我所能自己找到解决方案,我阅读了所有这些类似的问题并尝试了其他解决方案,例如: 基于国家的自动下拉菜单和 Geoplugin使用 php 中的 IP 地址获取当前国家/地区名称获取 IP 地址的国家/地区使用 PHP从他们的 Ip 获取访问者国家等等,但我不知道为什么它不起作用。我尝试了这个有效的代码,所以我发现我可以获得IP:

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

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

<?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”来尝试完全相同的代码,它不会返回任何内容!

#EDIT: 好吧,感谢@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,以防他们使用像我这样的私有网络?

所有想法都受到高度赞赏,

谢谢,

4

1 回答 1

0

尝试使用以下代码获取 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');
于 2014-09-22T10:21:52.363 回答