geoip邮编查询

Posted

技术标签:

【中文标题】geoip邮编查询【英文标题】:geoip zip code query 【发布时间】:2011-02-03 19:34:38 【问题描述】:

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

块: 起始IP, 结束IP, 定位。 地点: 定位, 国家, 地区, 城市, 邮政编码, 纬度, 长, 遇见, 区号。

创建 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的人,就公式而言,这是我做错了吗?

【问题讨论】:

我不熟悉 geoip,但我曾经偶然发现的一件事是 IP 地址按网络顺序排列,而我希望它们按主机顺序排列。这只是一个疯狂的猜测,但您可能想尝试一下。只需颠倒字节顺序(即 $z * 16777216, $y * 65536, ...) 刚试了,谢谢建议,还是没有骰子 对GeoIP不太了解,但我认为你刚刚实现了php的内置ip2long函数,很难:) 哈哈,在我有了这个脚本 facepalm 后我发现了这个功能 一件事——一旦你完成了你的参数替换,你能打印出 SQL 查询吗?也许某些东西将 $ipnum 格式化为带符号的数字,或其他东西。 【参考方案1】:

这是我使用的一个。如果它没有得到一个 GET 变量,它会使用用户的远程地址。

<?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>";
?>

【讨论】:

以上是关于geoip邮编查询的主要内容,如果未能解决你的问题,请参考以下文章

GeoIP 数据库 SQL 查询返回多个结果

如何在 Django 上使用 GeoIP 在 ASN 中查询已知 IP 地址?

HiveQL - 大数据的高效 geoip 发现

Openresty + GeoIP2实现IP归属国家查询

Openresty + GeoIP2实现IP归属国家查询

Openresty + GeoIP2实现IP归属国家查询