Как хранить IP в БД

1_52550c8237b5a52550c8237b97[1]Как ни странно, но многие разработчики до сих пор хранят ip адрес в базе плейн текстом, что вобщем то совсем непрактично.

На самом деле адрес IPv4 удобно хранить в виде беззнакового int 32. И в этой кратенькой статье я вам расскажу о том, как это делать и какие неоспоримые преимущества это дает. Я думаю, этот материал будет полезен многим.

Для начала рассмотрим способ преобразования ip в int. В PHP есть функция ip2long:

ip2long — Конвертирует строку, содержащую (IPv4) Интернет адрес с точками в допустимый адрес

Возвращает IPv4 адрес или FALSE, если параметр ip_address содержит ошибку.

То есть возвращает unsigned 32 int. Это то что нам подходит. Но появляется вот какой нюанс, в зависимости от того какой разрядности у нас система, эта функция будет выдавать разные результаты. Вот, к примеру, на 64 битной:

ip2long(0.0.0.0);          //0
ip2long(127.255.255.255); //2147483647
ip2long(128.0.0.0);        //2147483648
ip2long(255.255.255.255); //4294967295

Собственно, все верно. Так и должно быть. Но вот на 32 разрядной системе это будет выглядеть иначе:

ip2long(0.0.0.0);          //0
ip2long(127.255.255.255); //2147483647
ip2long(128.0.0.0);        //-2147483648
ip2long(255.255.255.255); //-1

Этот момент, кстати, отмечен в документации:

Ввиду того, что PHP тип integer является знаковым, и на 32-битных системах большое количество адресов будет представлено в виде отрицательных чисел, необходимо использовать «%u» в функции sprintf () или printf () для получения адреса в строковом беззнаковом виде.
Посему, эту функцию, при работе с базой данных, следует использовать так:

$ip = sprintf('%u', ip2long($ip));

Кстати о базе данных. Для поля в котором вы будете хранить IP адрес, не забывайте указывать UNSIGNED, иначе все ваши труды по правильному представлению числа в самом PHP пойдут насмарку.

Обратное преобразование выполняется с помощью функции long2ip. С ней, я думаю, вы сможете разобраться самостоятельно.

Запись навигация

Top