Сравнение диапазона 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) {

Другие вопросы по тегам