我想创建一个国家/地区下拉菜单,可以根据他/她的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 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>
现在我的问题是,如果他们使用像我这样的私人网络,如何获得用户真正的互联网IP?
所有想法都受到高度赞赏,
谢谢,
答案 0 :(得分: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');