【问题标题】:What would cause isset() and in_array() to both incorrectly evaluate?什么会导致 isset() 和 in_array() 都错误地评估?
【发布时间】:2018-04-30 15:37:24
【问题描述】:

编辑:

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

所以,我们有一个名为 $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 并且它们看起来很好......但是在这个服务器上(并且没有我们的其他服务器),代码进入 echo "Mail配置错误。”我不能(为了我的一生)弄清楚这一点......所以现在是 StackOverflow 时间。

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

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

  1. $mailSettings 位于函数 wuMail($mailData){ }
  2. $mailData 从包含 wuMail 文件的任何页面(用于配置/功能)传递给 wuMail()
  3. 在其他服务器上,wuMail($mailData) 不会导致错误。在这个服务器上,它认为数组中不存在这些值(也就是它认为开发人员试图通过传递一个不正确的密钥来错误地使用 wuMail())~ 我们这样做是为了防止开发人员错误,以便我们可以轻松地找到错误的页面如果是这种情况,请使用 wuMail ......好吧,我们认为是这种情况 - 并发现不,该函数的评估不正确。

有什么想法吗?

【问题讨论】:

  • array_key_exists() 有效,但我不明白为什么它不适用于 isset()。 Isset 检查它是否存在并且不为空......没有一个为空,所以 isset() 应该可以工作(就像它在我们拥有 wuMail 的每台其他服务器上一样)......为什么需要 array_key_exists() ?
  • 我 print_r'd 和 var_dump'd 一切 - 没有什么是空的。 array_key_exists 有效,并且 isset() 现在有效。似乎另一个开发人员正在处理我们的一些路由(我们用于文件包含/需要的东西),这使得我们的 wuMail() 配置错误地提取了一个文件。我奖励了 array_key_exists() 的答案,因为它是一个有效的解决方案,尽管我现在已经使用 isset(),因为它再次起作用了......令人沮丧!

标签: php evaluation isset


【解决方案1】:

您需要使用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);

【讨论】:

  • 所以,无论出于什么原因 - 它现在可以使用原始代码。 array_key_exists 确实有效,所以我会奖励你答案,但现在 isset() 也有效。我有 100% 绝对没有理由为什么它工作 - 我从一个小时前恢复到损坏的文件(现在也工作......不知何故)......所以我最好的选择是我们有一个缓存或路由问题(另一个开发人员是正在处理路由......所以他们可能有一个 10 分钟的变化,恰好与我同时做的事情一致)......谢谢你的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多