вторник, 5 февраля 2013 г.

PHP: особенности функции ip2long

Думаю, большинство программистов встречались с задачей хранения ip в БД. Хранить их как plain text (например, 127.0.0.1) неудобно и непрактично. Потому принято использовать функцию ip2long, которая преобразовывает ip адрес в целове число.

Но есть некоторые особенности ее использования в x32/x64. Допустим, для его хранения мы выделяем INT ячейку в БД.

Результат функции на x32:
ip2long(127.127.127.127) = 2147483648
ip2long(255.255.255.255) = -2147483648

Результат функции на x64:
ip2long(127.127.127.127) = 2147483648
ip2long(255.255.255.255) = 4294967296

Получается что 4294967296 не запишется в БД, так как ячейка в нашей БД типа INT и максимальное число, которое можно в нее записать: 2147483648.

Потому добавляем для атрибут UNSIGNED, который позволяет записывать в БД диапазон чисел от 0 до 4294967296.

Но как же быть с x32? Ведь в ней функция ip2long может вернуть отрицательное значение. Для решения этой проблемы нужно обрабатывать результат перед записью БД:
$ip = sprintf('%u', ip2long($ip)); // возвращает строку с положительным значением

3 комментария:

  1. Это совсем не решает проблемы ранжировки диапазона-адрессов и хранения ipv6

    ОтветитьУдалить
    Ответы
    1. http://www.highonphp.com/5-tips-for-working-with-ipv6-in-php

      Удалить
    2. Верно. Но целью данной заметки было рассказать об особенностях функции ip2long с которыми я столкнулся в ходе ее использования, а не учить работать с IP адресами.

      Удалить