Организация "фильтра IP"
Есть таблица в MySQL с двумя полями:
id_filter // integer
filter_ip // varchar, 35
Во второму поле хранится ip.
Схема работы проста, в начале скрипта выполняется запрос
Хочу изменить систему так, чтобы вместо значения конкретного ip, можно было ставить маски. Например, 127.0.0.* или 127.*. Как запрос для проверки построить в этом случае?
А ещё проще - использовать ip2long и long2ip функции php. И в коде просто вычислять крайние long-значения для подаваемой маски. Т.е. для 127.0.0.* берем ip2long("127.0.0.0") и ip2long("127.0.0.255"). И далее в запросе идет обычная проверка на IP: сравнивается он и полученные выше (в прошлом предложении) диапазоны.
Вот интересно, зачем ip-адресу 35 символов? даже в 100.100.100.100/255.255.255.255 всего 31 символ
Вот интересно, зачем ip-адресу 35 символов? даже в 100.100.100.100/255.255.255.255 всего 31 символ
Работа с символами всегда больее напряжная процедура цем с числами + для LIKE не работают индескы. Вариант UAS напорядок быстрее, а тем более, если записей в таблице будет много
А какая целесообразность такого фильтра?
Спасибо за интересный вариант. Попробую доработать.
=) Улыбнуло. Этот вариант прокатил бы, если дана маска, здесь случай обратный - маска хранится в БД.
Совершенно верно, по инерции списал параметры таблицы с другой. Там необходимо было предусмотреть возможность размещения в поле двух ip через запятую (в случае использования прокси), впрочем, к данной задаче это не относится :)
Совершенно точно сказано : - )
Совершенно верно. Я, во общем-то, уже не раз сталкивался с проблемой решения обычной задачи без тривиального решения для MySQL, но, увы, перейти на другую в рамках задачи не могу :-)