我正在尝试使用本教程中描述的ip2long
来压缩IP:
How to check an IP address is within a range of two IPs in 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。
答案 0 :(得分: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位体系结构上的负整数,因此需要使用“%u”格式化程序sprintf()或printf()以获取无符号IP地址的字符串表示。
修改强>
来自comments:
很高兴知道,但是为了什么邪恶的原因它在这里正常工作? prntscr.com/6i0o82因为它可能不是32位架构? - briosheje 12分钟前
是^它在线IDE中有效,因为它是64位架构。正如上面在32位体系结构的引用中提到的那样,这将不起作用,因为它会产生负面的插入,因此这就是你必须使用%u
+ sprintf()
或printf()
的原因。
我有哪种架构?
你可以这样做:
echo PHP_INT_MAX;
2147483647 -> 32 bit
9223372036854775807 -> 64 bit
编辑2:
同样来自comments:
btw我正在使用xampp,但在这种情况下它应该无关紧要? - user1721135 22分钟前
PHP不支持Windows上的64位或至少不支持官方。您可以在此处查看/阅读此内容:http://windows.php.net/
从那里引用:
x86_64构建 x64版本的PHP for Windows 应视为实验性,并且尚未提供64位整数或大文件支持。请参阅此帖子以了解正在进行的改进这些构建的工作。
所以你可能在Windows上使用xampp并且没有x4p版本的xampp:
如果您不在Windows上使用xampp,可以在此处下载带有64位php的xampp用于MAC和Linux:https://www.apachefriends.org/download.html
答案 1 :(得分:0)
您的代码中存在错误: $ ip2未定义。 这将是 : if($ ip&lt; = $ high_ip&amp;&amp; $ low_ip&lt; = $ ip){