首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义函数返回true,而它应该返回false?

自定义函数返回true,而它应该返回false?
EN

Stack Overflow用户
提问于 2013-03-24 05:47:03
回答 1查看 145关注 0票数 1

我有以下函数,它接受一组IP cidr或单个IP,如下所示:

代码语言:javascript
复制
$cidrs = array("127.0.0.1","65.87.43.65/32");

等等。

然后,该函数检查给定IP是否在IP和CIDR数组中侦听,是否在CIDR中,或者是否为指定的单个IP。

问题是,如果IP不包含CIDR掩码,则无论列表中的IP是什么,它都将始终返回true。

我确信它至少工作过一次,但是我不知道我做了什么改变使它的行为不同。

函数如下:

代码语言:javascript
复制
function testIP($user_ip, $cidrs)   
{  
    $ipu = explode('.', $user_ip);  
    foreach ($ipu as &$v)  
        $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);  

    $ipu = join('', $ipu);  
    $res = false;  

    foreach ($cidrs as $cidr)   
    {  

        $parts = explode('/', $cidr);  

        if (empty($parts))  
        {  
            if (in_array($user_ip, $cidrs))  
            {  
                $res = true;  
                break;  
            } 
            break;         
        }  



        $ipc = explode('.', $parts[0]);  

        foreach ($ipc as &$v) $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);  

        $ipc = substr(join('', $ipc), 0, $parts[1]);  

        $ipux = substr($ipu, 0, $parts[1]);  
        $res = ($ipc === $ipux);  
        if ($res) break;  
    }  
    return $res;  
}

我无论如何也想不出为什么它不再工作了--我已经为此浪费了很多时间!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-24 05:54:55

explode将始终返回一个数组。您的if (empty(...检查失败。先试试if (count($parts)==1),再试试$res = in_array($user_ip, $cidrs)

编辑:另外,不要中断,而是继续到下一个cidr:

代码语言:javascript
复制
    if (count($parts)==1)
    {  
        if (in_array($user_ip, $cidrs))  
        {  
            $res = true;  
            break;  
        } 
        continue;         
    }  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15592450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档