Статья

SQL формат. Конвертация IP адреса в IP номер

Таблица worldip содержит поля start, end и code. В одной строке записан один диапазон сети. start и end - это поля типа integer с IP номерами, code содержит двухбуквенный код страны, например "RU".
Конвертация IP адреса в IP номер происходит по следуюшей формуле:
IP Number = 16777216*A + 65536*B + 256*C + D
где IP Address = A.B.C.D
В PHP есть готовая функция, которая возвращает IP номер - ip2long($ip_address).
Например, IP адрес 91.121.147.207 конвертируется в IP номер 1534694351

Вы можете получить код страны из базы, например, таким запросом:
SELECT code FROM worldip WHERE start<=IP_NUMBER and end>=IP_NUMBER
Если вы инсталлируете вторую таблицу с названиями стран, то так можно получить и код и страну одним запросом:
SELECT wl.code,wl.country FROM worldip w LEFT JOIN worldip_land wl
 ON (w.code=wl.code) WHERE (w.start<=IP_NUMBER and w.end>=IP_NUMBER)
или только название страны:
SELECT wl.country FROM worldip_land wl LEFT JOIN worldip w
 ON (w.code=wl.code) WHERE (w.start<=IP_NUMBER and w.end>=IP_NUMBER)

Если вы используете API (чтобы получать более актуальные данные), вы можете поставить таблицу с названиями стран.
SELECT country FROM worldip_land WHERE code="GB"
вернет "United Kingdom" или "Великобритания" для русского варианта таблицы

Спасибо mgyk за подсказку использовать внутренние функции MySQL для преобразования адресов.
Во всех вышеперечисленных примерах можно заменить IP_NUMBER на inet_aton('IP_ADDR')
SELECT code FROM worldip WHERE 
(start<=inet_aton('77.77.77.77') and end>=inet_aton('77.77.77.77'))
mgyk Швеция02 Сен 2008 06:09#12Русский   
Конвертировать прямо mysql'ем
select inet_ntoa(168496141) -> 10.11.12.13
Обратное преобразование select inet_aton('10.11.12.13') -> 168496141;
Дима Украина02 Сен 2008 12:09#13Русский   
А как можно выбрать айпихи только по стране - скажем все айпи Франции?
Можете привести и исходники. Извиняюсь я не программист, но понять код могу :)
Спасибо!
wipmania logo Alrond 02 Сен 2008 13:09#14Русский   
Первый вариант, если нужны адреса всегда только Франции, то прежде чем устанавливать таблицу можно выкинуть оттуда все строки не FR, чтобы таблица выгладела например так:
INSERT INTO `worldip` (`start`, `end`, `code`) VALUES 

(3648419328, 3648419455, 'FR'),
(3648446464, 3648447055, 'FR');
И тогда пустой ответ из базы означает все что угодно кроме Франции.

Второй вариант, установить всю базу. А запрос для всех диапазонов(в формате IP адреса) одной страны такой:
SELECT inet_ntoa(start), inet_ntoa(end) FROM worldip WHERE code="FR"
Результат выглядит так (только часть его):
+------------------+-----------------+

| 212.43.192.0 | 212.43.255.255 |
| 212.44.224.0 | 212.44.255.255 |
| 212.47.224.0 | 212.47.255.255 |
+------------------+-----------------+
Ncs Россия03 Сен 2008 05:09#15Русский   
ip2long не всегда корректно, пример


<?php
echo ip2long('130.244.196.90').' '.ip2longer('130.244.196.90');
//-2097888166 2197079130

function ip2longer($ip)
{
return sprintf("%u", ip2long($ip));
}
?>

кстати, это оператор теле2, почему-то везде он показывается как Швеция, хотя люди из России ходят под таким ип :)
deeonis Латвия04 Мар 2009 10:03#672Русский   
У вас формула конвертации IP адреса в IP номер неправильная. Надо так:
IP Number = 16777216*D + 65536*C + 256*B + A
где IP Address = A.B.C.D
wipmania logo Alrond 08 Мар 2009 17:03#690Русский   
у нас правильная формула. A - это подсети класса /8, и в них 16 миллионов адресов

Аноним/Имя OpenID OpenID Yahoo! OpenID AOL WordPress LiveJournal TypePad Vox Myvidoop Orange Yandex YandexBlog Mixi Myspace Flickr Verisign MyOpenID ClaimID

Все поля необязательны для заполнения

Для самой статьи оставьте поле пустым.
Для комментария максимум 5000 символов. BBcode включены.

Подписаться на ответы: все комментарии:RSS comments (ru)

Please have a look at our
Facebook Page and leave a comment

Creative Commons License
Creative Commons Attribution-Noncommercial 3.0 License