2011-02-03 5 views
1

나는 csv geoip lite를 http://www.maxmind.com/app/geolitecountry에서 다운로드했습니다.지오 코드 우편 쿼리

블록 : startIP, endIP, locid 나는 다음과 같은 테이블로 내 DB로 데이터를 가져옵니다. 위치 : locid, 국가, 지역, 도시, 긴 을 PostalCode, 위도, 충족, 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는 호주에 없다.

지오프 (geoip)에 익숙한 사람들은 수식이 잘못 될 때까지 내가 잘못하고있는 것입니까?

+0

나는 geoip에 익숙하지 않지만, 내가 우연히 마주 쳤던 한 가지 점은 그들이 호스트 순서로있을 것으로 예상 할 때 네트워크 순서대로 beeing했다는 것입니다. 이것은 단지 추측이지만, 시도해 볼 수 있습니다. 단지 바이트의 순서를 바꿔서 (즉, $ 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>"; 
?> 
관련 문제