我的代码如下。根据我对不同网站和php文档的理解,empty()
是一种语言结构,用于检查密钥是否存在,就像isset()
一样(只是它还会松散' false'} - 变量或密钥存在时的比较......
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中的ORIGIN:40
更新 我通过将else部分包装在括号中来修复它。当我发现确切的问题(关联性或其他......)时,我会再次更新这个答案。
$origin =
(!empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] :
((!empty($_SERVER['HTTP_ORIGIN'])) ? $_SERVER['HTTP_ORIGIN'] :
(!empty($_SERVER['ORIGIN']) ? $_SERVER['ORIGIN'] :
"Unbekannte Herkunft"));
答案 0 :(得分:3)
这个错误的原因是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;
}
}