PHP in_array结果与IP地址允许的情况不符合预期

时间:2017-10-12 08:00:03

标签: php

我正在使用数组来允许可以访问的IP地址,但在使用数据库查询时会得到错误的结果。

while($dProfile = oci_fetch_array($qProfile))
{
    $allowedIP[] = array($dProfile['ALLOWED_IP_ADDRESS']);
}

if(in_array($_SERVER['REMOTE_ADDR'], $allowedIP))
{
    $ip = 1;
}
else
{
    $ip = 0;
}

echo $ip;

结果始终为0,甚至包括列表中的IP地址(192.168.183.28)。

当我print_r($allowedIP)时,结果为:

Array ( [0] => Array ( [0] => 192.168.183.205, 192.168.183.28 ) [1] => Array ( [0] => 192.168.184.20, 192.168.184.15 ) )

应该得到结果1,因为我的IP地址在数组列表中。

有什么技巧可以做到吗?

4 个答案:

答案 0 :(得分:2)

所以看起来$dProfile['ALLOWED_IP_ADDRESS']包含像'192.168.183.205, 192.168.183.28'这样的字符串,然后您将其填充到数组中的数组中。 in_array不会在数组中的字符串中发现字符串。您需要首先制作所有这些单独地址的一个平面数组:

while ($dProfile = oci_fetch_array($qProfile)) {
    $ips = array_map('trim', explode(',', $dProfile['ALLOWED_IP_ADDRESS']));
    $allowedIP = array_merge($allowedIP, $ips);
}

现在您有一个in_array可以搜索的IP平面列表。

但是,由于您首先从数据库中提取这些IP,因此您应该进行简单的数据库查询,而不是在PHP中构建和搜索此数组。

答案 1 :(得分:1)

in_array将检查数组的值,在您的情况下,它在数组值中有多个字符串格式的IP地址。

更改

while($dProfile = oci_fetch_array($qProfile))
{
    $allowedIP[] = array($dProfile['ALLOWED_IP_ADDRESS']);
}

$allowedIP = array();
while($dProfile = oci_fetch_array($qProfile))
{
    $allowedIP = array_merge($allowedIP, array_map('trim', explode(',', $dProfile['ALLOWED_IP_ADDRESS'])));
}

答案 2 :(得分:0)

您应该使用以下代码:

while($dProfile = oci_fetch_array($qProfile))
{
    $allowedIps = explode(', ',  $dProfile['ALLOWED_IP_ADDRESS']);
    foreach($allowedIps as $singleAllowedIp)
    {
        $allowedIP[] = $singleAllowedIp;
    }
}

而不是



while($dProfile = oci_fetch_array($qProfile))
{
    $allowedIP[] = array($dProfile['ALLOWED_IP_ADDRESS']);
}




答案 3 :(得分:-2)

测试此代码:

while($dProfile = oci_fetch_array($qProfile))
{
    $allowedIP[] = array($dProfile['ALLOWED_IP_ADDRESS']);
}
if([[$_SERVER['REMOTE_ADDR']]]==$allowedIP)
{
    $ip = 1;
}
else
{
    $ip = 0;
}

echo $ip;