Преобразование IP адресов

Автор: content Воскресенье, Апрель 8th, 2012 Нет комментариев

Рубрика: Язык PHP

ip2int: Преобразование ip-адреса в число (которое можно хранить в PHP, помещать в MySQL и.т.д.)

int2ip: Преобразование числа в ip-адрес

function int2ip($i) {
   $d[0]=(int)($i/256/256/256);
   $d[1]=(int)(($i-$d[0]*256*256*256)/256/256);
   $d[2]=(int)(($i-$d[0]*256*256*256-$d[1]*256*256)/256);
   $d[3]=$i-$d[0]*256*256*256-$d[1]*256*256-$d[2]*256;
   return "$d[0].$d[1].$d[2].$d[3]";
}

function ip2int($ip) {
   $a=explode(".",$ip);
   return $a[0]*256*256*256+$a[1]*256*256+$a[2]*256+$a[3];
}

Для чего надо преобразовать IP в число int ? Чтобы он занимал меньше места. IP в виде строки: «222.222.222.222″ — 15 байт. В виде числа — 4 байта. Это число можно писать в базу данных или переменную в PHP. В PHP 4 есть встроенные функции ip2long (аналог моей ip2int) и logn2ip, но они почему-то глючат (переводят ИП в отрицательные числа). Так что используйте мои, проверено — все работает на ура. Некоторые считают, что это не глюк, а фича. В любом случаее надо соблаюдать тип полей при вставке IP в базу: либo INT (для +/-), либо UNSIGNED INT (только +).

Если поняли смысл этой статьи, не забудьте сюда вернуться, т.к. хранить IP в виде строки — преступная :-) растрата ресурсов.

А еще можно переложить операции по переводу адресов на сам SQL. Запрос select INET_ATON("209.207.224.40") вернет соотвествующее число (3520061480). И наоборот, запрос select INET_NTOA(3520061480) вернет строку «209.207.224.40«. SQL переведет IP/число намного быстрее, чем функция на PHP или встроенная ip2long. Разумеется, нужно не select’ы делать (отдельным запросом), а использовать приведенные SQL’ные функции прямо во время вставки/выборки.

Автор: Дмитрий Бородин

Источник: http://www.php.su/articles/?cat=vars&page=004

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты