【问题标题】:Why does empty() throw an 'Undefined Index'-Error?为什么 empty() 会抛出“未定义索引”错误?
【发布时间】:2018-07-09 12:01:00
【问题描述】:

我的代码如下。根据我对不同网站和 php 文档的理解,empty() 是一种检查密钥是否存在的语言结构,就像isset() 一样(只是它也会在变量或密钥存在的情况下进行松散的“假”比较...

37     $origin = 
38                !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] :
39                !empty($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] :
40                !empty($_SERVER['ORIGIN']) ? $_SERVER['ORIGIN'] :
41                "Unknown Origin";

错误:

未定义的索引:somePHPFile.php:40 中的 ORIGIN

更新: 我通过将 else-parts 括在括号中来修复它。当我发现确切的问题(关联性或其他......)时,我将再次更新此答案。

        $origin = 
            (!empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] :
            ((!empty($_SERVER['HTTP_ORIGIN'])) ? $_SERVER['HTTP_ORIGIN'] :
            (!empty($_SERVER['ORIGIN']) ? $_SERVER['ORIGIN'] :
            "Unbekannte Herkunft"));

【问题讨论】:

  • 使用这样的嵌套三元运算应该是非法的。很难阅读和调试。
  • 在三元组中添加一些括号,以便正确处理。当你不使用括号时,事情会变得很奇怪。
  • 有趣。这是什么php版本?请提供一个最小但有效的代码示例供我们测试。谢谢。
  • 我将尝试在星期四之前提供一个工作的最小示例,以及 php 版本 - 如果没有找到真正的原因(可能是关联性),那么更早。
  • 请注意。现在,这对您来说可能看起来不错,但是当您在几周/几个月甚至几年后返回并需要阅读/更新该代码(或者更糟糕的是,其他人需要这样做)时,您会后悔的它。文件中的行很便宜。您应该尝试使代码更具可读性。另外,如果你这样做了,这可能不是一个问题。

标签: php


【解决方案1】:

这个错误的原因是 PHP 中三元运算符的关联性 - 它是 left-to-right,而在大多数其他语言中它是从右到左的。这就是为什么嵌套的三元组在读取 时都非常麻烦,以便用 PHP 编写。 )

在这种特殊情况下,它尤其意味着以下内容:如果设置了 HTTP_REFERER 标头,则还将检查 $_SERVER['HTTP_ORIGIN'] 的值。

要解决这个问题,您需要将条件括在括号中,使用简单的旧 if-elseif-else 组合,或者(对我来说最有意义)对您的代码进行一些抽象:

$origin = 'Unknown Origin';
$headersToCheck = ['HTTP_REFERER', 'HTTP_ORIGIN', 'ORIGIN'];
foreach ($headersToCheck as $header) {
  if (!empty($_SERVER[$header]) {
    $origin = $_SERVER[$header];
    break;
  }
}

【讨论】:

  • 它有效,因为没有检查成功。 This version 显示 OP 代码中发生的情况。
  • 啊。当然。当你以 that 方式展示它时,它是如此明显...... :-)
  • 我将 else-parts 括在括号中,而不是条件 - 请参阅我的更新。但你让我走上了正轨。谢谢你。也感谢您提供的替代方法。
  • @Toastgeraet 您需要按照要处理的顺序包装每个条件,例如(false === true ? true : (false === false ? true : false)) 参见:3v4l.org/pKP1C 示例。
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多