2

我正在尝试按照ip2long本教程中的描述使用 IP: 如何检查 IP 地址是否在 PHP 中两个 IP 的范围内?

代码如下:

$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。

4

2 回答 2

3

你必须使用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 位架构上会产生负整数,所以需要使用 sprintf() 或 printf() 的 "%u" 格式化器来获取无符号的字符串表示IP地址。

编辑:

评论来看:

很高兴知道,但是出于什么邪恶的原因,它在这里正常工作?prntscr.com/6i0o82因为它可能不是 32 位架构?– briosheje 12 分钟前

是的 ^ 在在线 IDE 中它可以工作,因为它是 64 位架构。正如上面在 32 位架构的引用中提到的,这不起作用,因为它会导致负插入,所以这就是为什么你必须使用%u+sprintf()printf()

我有哪种架构?

你可以简单地这样做:

echo PHP_INT_MAX;

2147483647          -> 32 bit
9223372036854775807 -> 64 bit

编辑2:

同样来自评论

顺便说一句,我正在使用 xampp,但在这种情况下应该没关系?– user1721135 22 分钟前

PHP 在 Windows 上不支持 64 位,或者至少不是官方的。你可以在这里看到/阅读:http: //windows.php.net/

并从那里引用:

x86_64 构建PHP for Windows 的 x64 构建应该被认为是实验性的,并且还不提供 64 位整数或大文件支持。请参阅这篇文章,了解正在进行的改进这些构建的工作。

因此,您可能在 Windows 上使用 xampp,并且没有 php 64 位版本的 xampp:

在此处输入图像描述

如果您不在 Windows 上使用 xampp,您可以在此处为 MAC 和 linux 下载带有 64 位 php 的 xampp:https ://www.apachefriends.org/download.html

于 2015-03-17T19:38:36.967 回答
0

您的代码中有一个错误:$ip2 未定义。它会是:如果 ($ip <= $high_ip && $low_ip <= $ip) {

于 2015-03-17T19:34:34.510 回答