Сравнение диапазона IP с использованием ip2long
Я пытаюсь вычислить IP с помощью ip2long
как описано в этом руководстве: Как проверить, что IP-адрес находится в диапазоне двух IP-адресов в PHP?
Код выглядит следующим образом:
$ip2 = ip2long("127.0.0.1");
$high_ip = ip2long("128.0.0.0");
$low_ip = ip2long("126.0.0.1");
if ($ip2 <= $high_ip && $low_ip <= $ip2) {
echo "in range";
}
else {
echo "no";
}
Я уже пытался переключить высокие и низкие IP-адреса и все еще получить тот же результат.
Почему мой сценарий не может обнаружить, что IP-адрес действительно находится в пределах досягаемости?
Примечание: мне нужно сравнить IP пользователя с широкими диапазонами, такими как: 1.1.2.0 - 1.2.2.0.
2 ответа
Вы должны использовать sprintf("%u", $ip)
, как это:
if (sprintf("%u", $ip) <= sprintf("%u", $high_ip) && sprintf("%u", $low_ip) <= sprintf("%u", $ip))
Зачем? Если вы посмотрите в руководство: http://php.net/manual/en/function.ip2long.php
Вы увидите, почему:
Примечание. Поскольку целочисленный тип PHP является подписанным, а многие IP-адреса приводят к получению отрицательных целых чисел в 32-разрядных архитектурах, вам необходимо использовать формататор "%u" функций sprintf() или printf (), чтобы получить строковое представление неподписанного Айпи адрес.
РЕДАКТИРОВАТЬ:
Как из комментариев:
Полезно знать, но по какой злой причине он здесь работает должным образом? http://prntscr.com/6i0o82 Потому что это может быть не 32-битная архитектура? - Бриошье 12 минут назад
Да, там в онлайн IDE это работает, потому что это 64-битная архитектура. И, как упоминалось выше в цитате о 32-битных архитектурах, это не сработает, потому что это приводит к отрицательным интергейсам, поэтому вы должны использовать %u
+ sprintf()
или же printf()
,
Какая у меня архитектура?
Вы можете просто сделать это:
echo PHP_INT_MAX;
2147483647 -> 32 bit
9223372036854775807 -> 64 bit
РЕДАКТИРОВАТЬ 2:
Также из комментариев:
Кстати, я использую xampp, но это не должно иметь значения в этом случае? - user1721135 22 минут назад
PHP не поддерживает 64-битные в Windows или, по крайней мере, не официально. Вы можете увидеть / прочитать это здесь: http://windows.php.net/
И цитата оттуда:
Сборки x86_64 Сборки x64 в PHP для Windows следует рассматривать как экспериментальные и пока не обеспечивают поддержку 64-битных целых или больших файлов. Пожалуйста, смотрите этот пост, чтобы продолжить работу по улучшению этих сборок.
Таким образом, вы, вероятно, используете xampp для Windows, и xampp с 64-битной версией php отсутствует:
И если вы не используете xampp в Windows, вы можете скачать xampp с 64-битным php здесь для MAC и Linux: https://www.apachefriends.org/download.html
В вашем коде есть ошибка: $ip2 не определен. Это будет: if ($ip <= $high_ip && $low_ip <= $ip) {