我从http://www.maxmind.com/app/geolitecountry下载了csv geoip lite。 我将该数据导入到我的数据库中,如下表所示:
块: startIP, endIP, LOCID。 地点: LOCID, 国家, 区域, 市, 邮政编码, LAT, 长, MET, AREACODE。
创建IPnum的代码是:
<? $ip =$_SERVER['REMOTE_ADDR'];
list($w, $x, $y, $z) = explode('.', $ip);
$one = 16777216* $w;
$two = 65536* $x ;
$three = 256*$y;
$ipnum = $one + $two+ $three + $z;
?>
然后我的查询是:
SELECT postalcode FROM location WHERE locid =(SELECT locid FROM blocks WHERE startIP <= '$ipnum' AND endIP>= '$ipnum' LIMIT 1)
对于IP为69.63.184.142,ipnum等于1161803918。 db确实返回一个查询,但是,该位置来自澳大利亚,而且该ip绝对不在澳大利亚。
那些熟悉geoip的人,就公式来说,我做错了吗?
答案 0 :(得分:0)
这是我使用的一个。如果它没有获得GET var,则使用用户的远程地址。
<?php
if(!empty($_GET['ip'])){
if(preg_match('!^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$!',$_GET['ip'])){
$ip_address=$_GET['ip'];
} else {
print ("invalid ip address");
}
} else {
$ip_address=$_SERVER['REMOTE_ADDR'];
}
$test = file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip_address);
$test = unserialize($test);
print "<html><pre>";
print_r ($test);
print "</pre></html>";
?>