2014-09-21 99 views
0

我想创建一个国家下拉菜单,可以根据他/她的IP地址预先选择用户国家。例如,如果用户在意大利,它必须首先显示意大利,同时将所有其他国家列入清单。php国家下拉由maxmind geoip

我搜索了很多,我开始下载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 Geoplugin,Fetching the current country name using ip address in php,Get Country of IP Address with PHP,Getting 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”即可得到相同的代码,但它不会返回任何结果!

#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> 

现在的问题是如何让用户真正的Internet IP在他们使用专用网络像我这样的情况?

所有的想法都高度赞赏,

感谢,

+0

首先,尝试开启[错误报告](http://stackoverflow.com/questions/845021/how-to-get-useful-error-messages-in-php)?这总是第一步。 – vch 2014-09-21 11:16:35

+0

@vch,我刚刚检查了error.log,我正在阅读你建议的链接。我会试试 – mOna 2014-09-21 11:27:59

+0

@vch:我在error.log中没有收到任何错误,我想我的问题与此ip相关:10.48.44.43(这是我通过运行$ _SERVER ['REMOTE_ADDR']获得的IP ;),当我在任何获得ip和返回国家的网站上输入这个IP时,即使在这些网站上它也不会返回任何内容!相反,他们告诉我另一个IP!我真的很困惑:( – mOna 2014-09-21 15:10:20

回答

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'); 
+0

非常感谢,我现在就试试。 – mOna 2014-09-22 10:30:36

+0

它还返回了私人IP:( – mOna 2014-09-22 10:34:40

+0

@mOna脚本无法知道您是否在VPN后面,我觉得,您将无法使用PHP获取IP – 2014-09-22 10:39:31