我正在尝试记录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地址,看它是否有效?
答案 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