我试图使用ip2long来压缩IP,如本教程所述:如何在PHP中检查IP地址在两个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";
}我已经尝试过切换高和低的I,但仍然得到了相同的结果。
为什么我的脚本不能检测到IP实际上在范围内?
注意:我需要比较用户的IP和范围很宽的IP,比如:1.1.2.0-1.2.2.0。
发布于 2015-03-17 19:38:36
您必须使用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位的架构?-布鲁谢耶12分钟前。
是的,在在线IDE中,它可以工作,因为它是64位的体系结构。正如上面引用的32位体系结构中所提到的那样,这是行不通的,因为它会导致负插入,这就是为什么您必须使用%u + sprintf()或printf()。
我有哪种建筑?
您可以简单地这样做:
echo PHP_INT_MAX;2147483647 -> 32 bit
9223372036854775807 -> 64 bit编辑2:
也来自评论
顺便说一句,我正在使用xampp,但在这种情况下这不重要吗?- 22分钟前的user1721135
PHP不支持windows上的64位,或者至少不支持官方版本。您可以在这里看到/阅读以下内容:http://windows.php.net/
在此引用如下:
x86_64构建x64构建的provide 应该被视为实验性,并且还没有提供64位整数或大型文件支持。请看这篇文章的工作正在进行中,以改善这些构建。
因此,您可能在windows上使用xampp,并且没有具有php 64位版本的xampp:

如果您不在windows上使用xampp,您可以在这里下载xampp和64位php,用于MAC和linux:https://www.apachefriends.org/download.html。
发布于 2015-03-17 19:34:34
代码中有一个错误:$ip2未定义。它将是: if ($ip <= $high_ip && $low_ip <= $ip) {
https://stackoverflow.com/questions/29108058
复制相似问题