PHP in_array函数在服务器中不起作用

时间:2018-09-02 05:47:53

标签: php

我使用此函数,当$hexIpStr存在时,Fine on Local表示函数返回false,否则返回true, 但是,当我在服务器上部署项目时,此函数仅返回True, $ arr是2D数组。

function ipChecker($arr, $hexIp)
{
    $hexIpStr = "HEX=" . $hexIp;
    foreach ($arr as $members) {
        if (in_array($hexIpStr, $members)) {
            return false;
        } else {
            return true;
        }
    }
}

例如,使用以下值调用该函数:

$hexIp = 'f528764d624db129b32c21fbca0cb8d6';
$arr = array(
  0 => [
    0 => 'FullName=mehdi',
    1 => 'Email=test@gmail.com',
    2 => 'IP=127.0.0.1',
    3 => 'HEX=f528764d624db129b32c21fbca0cb8d6',
    4 => '=>',
    5 => 'Opinion=1 ',
  ],
  1 => [
    0 => '',
  ],
);

没有答案,因为它在服务器上很好我得到了

  

FullName = asd电子邮件=kingblack5230@gmail.com IP = 192.119.160.197   HEX = dd029394f038b0775138a23df8d9cddd =>意见= 1及其权利和我   使用此功能获取用户ip:

function GetRealIp()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
    {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
    {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
 }
    return $ip;}

2 个答案:

答案 0 :(得分:1)

f528764d624db129b32c21fbca0cb8d6 #md5('127.0.0.1'),这可能不是您期望的/ $members中的值(IP)。您可能希望使用公共IP。

如果您依靠$_SERVER['REMOTE_ADDR'],可能会遇到问题。如果您的服务器将请求代理到同一台计算机上的PHP工作者(而不是直接使用mod_php),则REMOTE_ADDR将是代理的IP(127.0.0.1 / {{1 }}),而不是访客。

在这种情况下,您应该转储localhost并检查变量$_SERVER /使用该变量而不是HTTP_X_FORWARDED_FOR,代理服务器可能会将其添加为包括原始IP。 / p>

答案 1 :(得分:1)

在检查第一个孩子的 HEX = ... 字符串后,您的函数“提前返回”(从而中断foreach)。这意味着您只能检查第一个成员。

鉴于此$arr,您的成员就在那里,只是不在第一位置:

array(
  0 => [
    0 => 'FullName=blub',
    1 => 'Email=blub@gmail.com',
    2 => 'IP=1.2.3.4',
    3 => 'HEX=6465ec74397c9126916786bbcd6d7601',
  ],
  1 => [
    0 => 'FullName=mehdi',
    1 => 'Email=test@gmail.com',
    2 => 'IP=127.0.0.1',
    3 => 'HEX=f528764d624db129b32c21fbca0cb8d6',
  ],
)

它将返回true,因为仅检查了in_array('HEX=f528764d624db129b32c21fbca0cb8d6', ['HEX=6465ec74397c9126916786bbcd6d7601'])

您应该重组函数,以便它只能在找到成员的情况下“ return提前”,否则,它将继续检查所有成员,并仅在最后返回另一种情况:

function ipChecker($arr, $hexIp)
{
    $hexIpStr = "HEX=" . $hexIp;
    foreach ($arr as $members) {
        if (in_array($hexIpStr, $members)) {
            return false;
        }
    }
    return true;
}