你必须使用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