Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Хранение ip адресов в БД MySql
Подскажите наиболее удачный способ хранения ip адресов

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Gimmi

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно хранить ip адреса в бд, причем нужно сделать так, что бы можно было бы задавать диапазон адресов.
Есть вариант перевода: 177.210.102.6 => ((177*256+210)*256+102)*256+6 = 2983355910.
Но это не устраивает, т.к. узнать ip по 2983355910 можно только перебором...  
Например, движок phpBB как-то конвертит адреса... но как?  
 
Добавлено
из phpBB:
function encode_ip($dotquad_ip)
{
$ip_sep = explode('.', $dotquad_ip);
return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}
 
function decode_ip($int_ip)
{
$hexipbang = explode('.', chunk_split($int_ip, 2, '.'));
return hexdec($hexipbang[0]). '.' . hexdec($hexipbang[1]) . '.' . hexdec($hexipbang[2]) . '.' . hexdec($hexipbang[3]);
}
 
Но не понятно... может кто объяснит?

Всего записей: 361 | Зарегистр. 09-02-2004 | Отправлено: 16:02 26-08-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
узнать ip по 2983355910 можно только перебором...  
Чтобы не говорить подобных глупостей нужно дружить с математикой
Код:
<?
  $ip=2983355910;
  echo (($ip>>24)&0xFF).'.'.(($ip>>16)&0xFF).'.'.(($ip>>8)&0xFF).'.'.($ip&0xFF);
?>

Цитата:
не понятно... может кто объяснит?
Что тут непонятного? Всё написано чуть-ли не человеческим языком Если функции незнакомы - иди почитай мануал explode, sprintf, hexdec

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 16:45 26-08-2004 | Исправлено: SiMM, 19:08 26-08-2004
aadym



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть такие функции:
ip2long http://ru.php.net/manual/ru/function.ip2long.php и
long2ip http://ru.php.net/manual/ru/function.long2ip.php

Всего записей: 177 | Зарегистр. 26-12-2001 | Отправлено: 09:34 27-08-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aadym, есть, только ip2long возвращает знаковые результат, поэтому делать проверку в диапазоне надо умеючи:
ip2long('127.255.255.253')=2147483645
ip2long(128.0.0.2)=-2147483646
127.255.255.254 и 128.0.0.1 в диапазон входить не будут - поэтому либо придётся преобразовывать знаковый в беззнаковый выражением типа $ip<0 ? 4294967296+$ip : $ip, либо выдумывать что-то ещё

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 10:25 27-08-2004 | Исправлено: SiMM, 10:51 27-08-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SiMM

Код:
 
<?PHP
echo long2ip(ip2long("128.0.0.2"));
?>

Результат правильный

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 23:19 27-08-2004 | Исправлено: Swappp, 23:27 27-08-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp, какой (понятие правильности результата довольно расстяжимо)? Под виндой даёт именно то, что я привёл (4.3.6) - хотя если межплатформенная совместимость никого не волнует - то ради бога.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 01:06 28-08-2004
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp

Цитата:
Результат правильный

ессно правильный.. иначе бы смысла не было в этих функциях.
речь идет о другом же, о диапазонах.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:11 28-08-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery

Цитата:
речь идет о другом же, о диапазонах.

А, понял, тогда читаем документацию:
sprintf("%u", ip2long($ip));
long2ip вроде нормально принимает unsigned int
SiMM

Цитата:
Под виндой даёт именно то, что я привёл

От ОС это не зависит. От архитектуры процессора может... хотя врядли.

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 03:19 28-08-2004 | Исправлено: Swappp, 03:20 28-08-2004
xntx



хнотик-багоискатель
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Swappp

Цитата:
А, понял, тогда читаем документацию:  
sprintf("%u", ip2long($ip));  

аааа эээтоо зачем? ??
 
а диапазоны можно попробовать переводя 127.0.0.1 и 127.0.0.255, а потом выбирая значения между ними...

----------
Hello world!

Всего записей: 5169 | Зарегистр. 15-02-2003 | Отправлено: 15:12 30-08-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xntx
Читай внимательнее... ip2long возвращает signed int (целое число со знаком, длинна 32 бита) соответственно

Цитата:
ip2long('127.255.255.253')=2147483645
ip2long(128.0.0.2)=-2147483646

Как после этого выяснить входит ли 127.255.255.254 в диапазон, если он от 2147483645 до -2147483646?

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 19:51 30-08-2004
Gimmi

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как быть когда надо задать диапазон адресов? как это реализовать?

Всего записей: 361 | Зарегистр. 09-02-2004 | Отправлено: 13:53 01-09-2004
xntx



хнотик-багоискатель
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Swappp
...а.... незаметил....
 
Gimmi
а если просто делать:
127.0.0.1 = 127000000001
127.0.255.255 = 127000255255
так можно и хранить, и диапазоны задавать...

----------
Hello world!

Всего записей: 5169 | Зарегистр. 15-02-2003 | Отправлено: 14:26 01-09-2004
Gimmi

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xntx
если так хранить, то создавать 2 поля в БД. Первое это начальное значение диапазона, второе - конечное. так?

Всего записей: 361 | Зарегистр. 09-02-2004 | Отправлено: 14:34 01-09-2004
xntx



хнотик-багоискатель
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ну да

----------
Hello world!

Всего записей: 5169 | Зарегистр. 15-02-2003 | Отправлено: 16:04 01-09-2004
Swappp

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xntx

Цитата:
127.0.0.1 = 127000000001  

тоже способ, но не очень экономичный, с точки зрения использования памяти и дискового
пространства, да и операции с числами больше 32bit медленные, хотя на PHP этим можно пренебречь.
Gimmi

Код:
$ip_start = sprintf("%u", ip2long('127.0.0.1'));
$ip_end = sprintf("%u", ip2long('127.0.0.255'));
$ip = sprintf("%u", ip2long('127.0.0.5'));
if($ip>$ip_start && $ip<$ip_end)
{
  //ip-адрес входит в диапазон
}
else
{
  //ip-адрес НЕ входит в диапазон
}

думаю разберешься, что есть что. И еще в mysql создавай поле таблици с типом INT и атрибутом UNSIGNED.

Всего записей: 1716 | Зарегистр. 02-11-2001 | Отправлено: 21:38 01-09-2004 | Исправлено: Swappp, 21:41 01-09-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В дополнение к словам Swapppа: если диапазоны ip хранятся в MySQL, то может быть более разумным задавать условие в самой выборке - преемлемость и выгодность того или иного варианта зависит от задачи.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 22:08 01-09-2004
Gimmi

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Swappp
спасибо.

Всего записей: 361 | Зарегистр. 09-02-2004 | Отправлено: 14:46 02-09-2004 | Исправлено: Gimmi, 15:18 02-09-2004
Gimmi

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И последнее. Как правильнее всего обрабатывать шаблоны ip адресов?  
 
 
(если адреса можно задавать в виде: 62.?9.242.15 или 62.89.240.15 - 62.89.242.15 или 62.89.242.*)

Всего записей: 361 | Зарегистр. 09-02-2004 | Отправлено: 15:23 07-09-2004 | Исправлено: Gimmi, 15:25 07-09-2004
MadMikie

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Еще есть такая функция в MySQL: inet_ntoa() - то же, что и long2ip , inet_aton() - то же, что и ip2long. Я думаю, работать быстрее будет.
А вот с шаблонами - если надо просто задавать начальный и конечный айпишник - то так же, а если нет - тогда только строками. По-другому никак.

Всего записей: 10 | Зарегистр. 07-09-2004 | Отправлено: 20:11 09-09-2004
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я думаю, работать быстрее будет.
Без разницы (по крайней мере, если она и есть, она несущественна) - в базе всё хранится в LONGINT.
Цитата:
если надо просто задавать начальный и конечный айпишник - то так же, а если нет - тогда только строками. По-другому никак.
Ничего подобного - предыдущий запрос можно преобразовать к виду:
62.?9.242.15 => (ip & 0xFF80FFFF) = 0x3e00f20f AND (ip & 0xFF0000)%0xA0000 = 0x90000 AND (ip & 0xFF0000)<=0x630000
62.89.240.15 - 62.89.242.15 => (ip & 0xFFFCFFFF) = 0x3e59f00f AND (ip&0x30000)<=0x20000
62.89.242.* => (ip & 0xFFFFFF00) = 0x3e59f200
Другое дело - тут есть над чем призадуматься ;) Но то, что выборка будет быстрее, чем в случае со строками - думаю, очевидно.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 20:50 09-09-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Хранение ip адресов в БД MySql


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru

Рейтинг.ru