使用ip2long进行IP范围比较

时间:2015-03-17 19:30:59

标签: php ip range ip2long

我正在尝试使用本教程中描述的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。

2 个答案:

答案 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:

enter image description here

如果您不在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){