inet_ntop导致警告:inet_ntop():无效的in_addr值

时间:2015-01-13 18:29:34

标签: php

我正在尝试记录IP地址,并且在使用inet_ntop()时偶尔会出现以下错误:

  

警告:inet_ntop():无效的in_addr值

基于this thread我尝试了以下代码,但所有发生的事情都是我的所有IP地址都被标记为无效。

$is_valid = filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) || filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);

有没有办法有效地检查打包的IP地址,看它是否有效?

1 个答案:

答案 0 :(得分:2)

这已经很晚了,但我自己也遇到了这个问题,所以希望它可以帮助别人。

您的$row['ip']变量是打包(二进制)地址,但filter_var需要字符串表示。这是一个问题,因为获取字符串表示的唯一方法是使用inet_ntop,这可能会发出警告......

我发现的唯一解决方案是每次使用inet_ntop时都禁止​​警告。该函数返回false,因此您可以检查是否存在问题。我将它包装在一个易于使用的功能中:

function isValidPackedIP($packed)
{
    $isValid = false;
    $ipStr = @inet_ntop($packed);
    if ($ipStr !== false) {
        $isValid = filter_var($ipStr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4|FILTER_FLAG_IPV6) !== false;
    }

    return $isValid;
}

用法:

$ip4 = inet_pton('127.0.0.1');
$ip6 = inet_pton('::1');
isValidPackedIP($ip4); // true
isValidPackedIP($ip6); // true
isValidPackedIP(null); // false, no warning