запрос почтового индекса geoip

Я загрузил CSV-файл GeoIP lite с сайта http://www.maxmind.com/app/geolitecountry. . Я импортировал эти данные в свою базу данных в виде следующих таблиц:

Блоки: startIP, endIP, locid. Местоположение: locid, страна, регион, город, почтовый индекс, lat, long, 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. База данных возвращает запрос, однако местоположение находится в Австралии, и этот IP-адрес определенно не в Австралии.

те, кто знаком с geoip, это что-то, что я делаю неправильно, насколько формула идет?


person Ryan    schedule 03.02.2011    source источник
comment
Я не знаком с geoip, но однажды я наткнулся на одну вещь: IP-адреса находились в сетевом порядке, хотя я ожидал, что они будут в порядке хоста. Это всего лишь дикая догадка, но вы можете попробовать. Просто измените порядок байтов (то есть $z * 16777216, $y * 65536,...)   -  person Patrick Echterbruch    schedule 03.02.2011
comment
только что попробовал, спасибо за предложение, но до сих пор нет кости   -  person Ryan    schedule 03.02.2011
comment
Не много знаю о GeoIP, но я думаю, что вы только что внедрили встроенный в PHP ip2long работать сложно :)   -  person Matt Gibson    schedule 03.02.2011
comment
ха-ха, я нашел эту функцию после того, как у меня был этот скрипт {facepalm}   -  person Ryan    schedule 03.02.2011
comment
Одна вещь - можете ли вы распечатать SQL-запрос после того, как вы сделали в нем подстановку параметров? Может быть, что-то форматирует $ipnum как число со знаком или что-то в этом роде.   -  person Matt Gibson    schedule 03.02.2011
comment
Я заметил одну вещь в вашем запросе: вы заключаете одинарные кавычки вокруг $ipnum. Я не совсем ошибаюсь, вы должны удалить их, так как $ipnum - это числовой тип данных.   -  person Patrick Echterbruch    schedule 03.02.2011
comment
Да, и еще: вы вводите $ipnum в виде строки, заключая параметр в одинарные кавычки, так и должно быть? Какой тип столбца в вашей базе данных? Потому что, если это строка в базе данных, вы будете сравнивать ее по алфавиту, а не по числам. Это означает, что «1161803918» попадает, например, в диапазон от «100» до «200» :)   -  person Matt Gibson    schedule 03.02.2011
comment
да, спасибо, ребята, как startIP, так и endIP являются целыми, и я удалил одинарные кавычки, но кости все еще нет. Я думаю, что это как-то связано с моим преобразованием из 000.000.000.000 в ipNum, хотя я не уверен, что именно   -  person Ryan    schedule 03.02.2011
comment
Странный. Конечно, похоже, что вы получаете правильное число от этого преобразования. Вы пробовали еще несколько IP-адресов? Возможно, база данных просто повреждена для этого конкретного IP-адреса. И сколько локаций вы получите обратно, если просто SELECT locid FROM blocks WHERE... без лимита?   -  person Matt Gibson    schedule 04.02.2011
comment
Вот их ссылка на файлы, которые они предоставляют. dev.maxmind.com/geoip/csv   -  person AbsoluteƵERØ    schedule 23.03.2013


Ответы (1)


Вот тот, который я использую. Если он не получает 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>";
?>
person AbsoluteƵERØ    schedule 23.03.2013