什么会导致 isset() 和 in_array() 都错误地求值?

What would cause isset() and in_array() to both incorrectly evaluate?

编辑:

开发人员破坏了路由。它以某种方式影响了我的页面,导致它在生产中失败,这就是为什么它的行为与使用邮件程序的其他服务器不同的原因。

因此,我们有一个名为 $mailSettings 的数组。如果未向邮件程序提供新值,则此数组处理默认值。这是在这里设置的:

     $mailSettings = array(
        "TOADDRESS" => $wuMail_Config->DefaultToAddress,
        "TONAME" => $wuMail_Config->DefaultToName,
        "CC" => $wuMail_Config->DefaultCC,
        "BCC" => $wuMail_Config->DefaultBCC,
        "SUBJECT" => $wuMail_Config->DefaultSubject,
        "MESSAGE" => $wuMail_Config->DefaultMessage,
        "HTML" => $wuMail_Config->DefaultHTML,
        "FROMADDRESS" => $wuMail_Config->DefaultFromAddress,
        "FROMNAME" => $wuMail_Config->DefaultFromName,
        "REPLYADDRESS" => $wuMail_Config->DefaultReplyAddress,
        "REPLYNAME" => $wuMail_Config->DefaultReplyName
    );

现在,在下一部分 - 我们分析提交的数据...在这个具体案例中,我们只提交了几个自定义字段,其余部分依赖默认值.

        $mailData = array(
            "TOADDRESS" => $email,
            "TONAME" => $username,
            "SUBJECT" => "Welcome to SiteName! Please verify your email address.",
            "MESSAGE" => $message,
            "HTML" => $message
        );

所以,我们所做的是:我们获取 $mailData,并将每个键名转换为大写版本。因此,如果他们提交 "toAddReSs",它将被评估为 "TOADDRESS",在所有大写字母中 - 以匹配 $mailSettings 数组。我们在这里这样做...

foreach($mailData as $submittedOption => $submittedValue){
        $submittedOptionUPPER = strtoupper($submittedOption);
        $submittedOpts[] = $submittedOptionUPPER;
        if(in_array($submittedOptionUPPER, $mailSettings)){
            $mailSettings[$submittedOptionUPPER] = $data[$submittedOption]; 
        } else {
            echo "Mail Configuration Error"; 
        }
    }

我也尝试过 if(isset($mailSettings[$submittedOptionUPPER]){ 但这也不起作用。当我 print_r $mailData & $mailSettings 时,两者与上面完全相同(与从我们的配置文件中正确提取默认值。

问题是我可以在 eval(isset 或 in_array)的正上方为两个数组做 print_r,它们看起来很好......但是在这个服务器上(和 none 我们其他服务器的),代码进入 echo "Mail Configuration Error." 我不能(我这辈子)弄清楚这一点......现在是 Whosebug 时间了。

是否有任何原因 isset 和 in_array 都会在某些事情上(仅在一台特定服务器上)失败?

需要了解的其他事实...

  1. $mailSettings 位于函数 wuMail($mailData){ }
  2. $mailData 从任何包含 wuMail 文件的页面传递给 wuMail()(针对 configuration/function)
  3. 在其他服务器上,wuMail($mailData) 没有产生错误。在此服务器上,它认为值不存在于数组中(也就是认为开发人员试图通过传递不正确的键来错误地使用 wuMail())~我们这样做是为了防止开发人员错误,以便我们可以轻松地找到错误的页面如果是这种情况,则使用 wuMail...好吧,我们认为是这种情况 - 并发现不,该函数评估不正确。

有什么想法吗?

您需要使用 array_key_exists($submittedOptionUPPER, $mailSettings)isset($mailSettings[$submittedOptionUPPER]) 来检查密钥,但我认为您所做的归结为:

// covert keys to uppercase
$mailData = array_change_key_case($mailData, CASE_UPPER);

// check if there are keys in $mailData that aren't in $mailSettings
if(array_key_diff($mailData, $mailSettings) {
    echo "Mail Configuration Error"; // do something else?
}
// merge $mailData into $mailSettings
$mailSettings = array_merge($mailSettings, $mailData);