【问题标题】:IP range comparison using ip2long使用 ip2long 比较 IP 范围
【发布时间】:2015-05-20 09:51:44
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

  • 请说明投反对票的原因
  • 先生,$ip2 在哪里?看起来那里有打字错误。 (虽然没有投反对票)
  • 当我运行您的代码时,纠正 $ip 变为 $ip2 的拼写错误,我得到“在范围内”。
  • 我修复了代码,由于某种原因仍然得到“否”
  • 这里与@kainaw 相同。你确定你修复了 both $ip2 吗?有 2 个 $ip2。 prntscr.com/6i0o82

标签: php ip range ip2long


【解决方案1】:

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

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

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

还有一段话:

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

所以你可能在 windows 上使用 xampp 并且没有 php 64 位版本的 xampp:

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

【讨论】:

  • 很高兴知道,但出于什么邪恶的原因,它在这里正常工作? prntscr.com/6i0o82 因为它可能不是 32 位架构?
  • @Rizier123:可能是因为它是一个在线编辑器而进行了一些服务器端转换?大声笑
  • @briosheje 更新了我的答案如何检查您拥有的架构以及它为何在在线 IDE 中工作
  • @user1721135 更新了我的答案!我假设您在 Windows 上使用 xampp
【解决方案2】:

您的代码中有一个错误: $ip2 未定义。 这将是 : if ($ip

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2017-03-04
    • 2013-07-30
    • 2015-08-31
    • 2014-04-17
    • 2010-09-13
    相关资源
    最近更新 更多