【问题标题】:PHP in_array function not working in serverPHP in_array 函数在服务器中不起作用
【发布时间】:2018-09-02 05:47:52
【问题描述】:

我使用这个函数和它的 Fine on Local 意味着当 $hexIpStr 存在函数时返回 false 否则返回 true, 但是当我在服务器上部署我的项目时,这个函数只返回真, $arr 是二维数组。

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 => '',
  ],
);

不,它不回答,因为它在服务器上很好,我得到了这个

全名=asd 电子邮件=kingblack5230@gmail.com IP=192.119.160.197 HEX=dd029394f038b0775138a23df8d9cddd => Opinion=1 and its right and i 使用此函数获取用户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;}

【问题讨论】:

  • 本地返回了什么?如果返回true,只表示在数组$members中没有找到保存数据的变量$hexIpStr
  • 不,唯一不同的是本地和服务器
  • 您能否通过var_dump($hexIpStr);var_dump(members); 检查$hexIpStr 是否真的在数组members 中找到。
  • 你在服务器上做了var_dump() 吗? (不应该在本地完成,因为它在那里工作正常)。使用上面的代码,它返回 true 的唯一原因是 $hexIpStr 不存在于 $members 中。
  • 把你的$arr 输出放在这里。

标签: php


【解决方案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 early”,如果没有,继续检查所有成员,最后只返回另一种情况:

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

【讨论】:

    【解决方案2】:

    f528764d624db129b32c21fbca0cb8d6(#)md5('127.0.0.1'),这可能不是您期望的值 (IP)/$members。您可能需要一个公共 IP。

    如果您依赖$_SERVER['REMOTE_ADDR'],这可能是问题所在。如果您的服务器将请求代理到同一台机器上的 PHP 工作者(而不是直接使用例如 mod_php),REMOTE_ADDR 将是代理的 IP(127.0.0.1/localhost)而不是访问者。

    在这种情况下,您应该转储 $_SERVER 并检查变量 HTTP_X_FORWARDED_FOR / 使用它而不是 REMOTE_ADDR,代理服务器可能会添加它以包含原始 IP。

    【讨论】:

    • 不,不是答案,请在问题中解释原因
    • 感谢您更新问题。是的,这是一个猜测。看到您的$arr 后,我发现循环更可能存在问题。检查stackoverflow.com/a/52134997/7362396
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多