我正在尝试记录IP地址,每次使用inet_ntop()时都会收到以下错误:
警告: inet_ntop():无效的in_addr值
基于这条线,我尝试了以下代码,但所发生的只是我的所有IP地址都被标记为无效。
$is_valid = filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) || filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);是否有任何方法有效地检查一个打包的IP地址,看看它是否有效?
发布于 2016-02-22 18:14:03
现在已经很晚了,但我自己也遇到了这个问题,希望它能帮助到其他人。
您的$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 warninghttps://stackoverflow.com/questions/27928999
复制相似问题