1

我已经从http://www.maxmind.com/app/geolitecountry下载了 csv geoip lite 。我将该数据导入到我的数据库中,如下表所示:

块:startIP、endIP、locid。位置:locid、国家、地区、城市、邮政编码、lat、long、met、区号。

创建 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)

对于 69.63.184.142 的 IP,ipnum 等于 1161803918。db 确实返回了查询,但是,该位置来自澳大利亚,并且该 ip 绝对不在澳大利亚。

那些熟悉geoip的人,就公式而言,我做错了什么吗?

4

1 回答 1

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>";
?>
于 2013-03-23T00:48:48.117 回答