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

1

Решение

Вы должны использовать 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

3

Другие решения

В вашем коде есть ошибка:
$ ip2 не определен.
Это было бы :
если ($ ip <= $ high_ip && $ low_ip <= $ ip) {

0

По вопросам рекламы [email protected]