【发布时间】: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 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”,它不会返回任何内容!
#编辑: 好吧,感谢@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