2011-02-03 21 views
1

私はhttp://www.maxmind.com/app/geolitecountryからcsv geoip liteをダウンロードしました。geoip郵便番号のクエリ

ブロック:: startIP、 endIP、 LOCID は、私は次の表のように私のDBにそのデータをインポートしました。 場所: LOCID、 国、 地域、 市、 郵便番号、 緯度、 長い、 は、 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; 
?> 

その後、私のクエリは次のとおりです。69.63.184.142のIPのための

SELECT postalcode FROM location WHERE locid =(SELECT locid FROM blocks WHERE startIP <= '$ipnum' AND endIP>= '$ipnum' LIMIT 1) 

、ipnumはデシベルが行う1161803918. に等しく、クエリは返されますが、その場所はオーストラリアからのものであり、そのIPはオーストラリアにはありません。

ジオップに精通している人は、フォーミュラが行く限り間違っていますか?

+0

私はGeoIPのに慣れていないんだけど、私は彼らがホスト順番になると予想するとき、私は一度accrossをつまずいた一つのことは、ネットワークの順にbeeingてIPアドレスでした。これは単なる推測ですが、試してみるとよいでしょう。ちょうどそのバイトの順序を逆にしてください(すなわち、$ z * 16777216、$ y * 65536、...) –

+0

ちょうど試してみましたが、提案に感謝しましたが、ダイスはまだありません – Ryan

+0

GeoIPについてよく知らないけどPHPの組み込みの[ip2long](http://php.net/manual/en/function.ip2long.php)機能を難しい方法で実装したと思っています:) –

答えて

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