Я пытаюсь вычислить 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.
Вы должны использовать 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 () получить строковое представление неподписанного IP-адреса.
РЕДАКТИРОВАТЬ:
Как из Комментарии:
Хорошо знать, но по какой злой причине он здесь работает должным образом? 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 не определен.
Это было бы :
если ($ ip <= $ high_ip && $ low_ip <= $ ip) {