Все ленты — последние статьи

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

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

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'ные функции прямо во время вставки/выборки.