PHP 会话在 if 语句中意外更改并忽略 echo 命令


PHP session changes unexpectedly in if statement and ignores echo command

当Wordpress中的特定页面显示时,我将$_SESSION['showroom']设置为"活动":

if(get_the_ID()==6470||get_the_ID()==252){
    $_SESSION['showroom']='active';
}

然后,我设置了 2 个页面数组进行检查。如果显示的下一页不在其中一个数组中,则 $_SESSION['showroom'] 将更改为"非活动"。

$allowed_templates = array('template-A.php',
                           'template-B.php',
                           'template-C.php',
                           'template-E.php',
                           'template-G.php');
$allowed_ids = array(6470,252);
$template_name = get_page_template_slug();
$page_id = get_the_ID();
if(in_array($template_name,$allowed_templates)==false && in_array($page_id,$allowed_ids)==false){
    $_SESSION['showroom']='inactive';
}

if 语句大部分时间都有效,但有时我的 $_SESSION['showroom'] 会更改为非活动状态,即使其中一个数组返回 true!经过几个小时的测试,我无法找到问题所在。回显 if 语句的两个部分总是给我 2 个真或 1 个真 + 1 假,但永远不会给我 2 个假:

if(in_array($template_name,$allowed_templates)==false){echo 'TFALSE';}
if(in_array($template_name,$allowed_templates)){echo 'TTRUE';}
if(in_array($page_id,$allowed_ids)==false){echo 'IFALSE';}
if(in_array($page_id,$allowed_ids)){echo 'ITRUE';}

我在这里错过了什么?

提前感谢任何帮助!

编辑:继续测试并发现以下异常:

    if(in_array($template_name,$allowed_templates)==false && in_array($page_id,$allowed_ids)==false){
    $_SESSION['showroom']='inactive';
    echo 'SET TO INACTIVE';
}

if 语句将 $_SESSION['陈列室'] 更改为"非活动",但不回显"设置为非活动"!

这里发生了一些奇怪的事情!

问题解决了。我的代码很好。两个丢失的图像文件导致WordPress崩溃我的会话。花了10个小时才找到答案,但很高兴我找到了。感谢大家的帮助。

您可以尝试以下操作;

 if(!in_array($template_name,$allowed_templates) && !in_array($page_id,$allowed_ids)){
     $_SESSION['showroom']='inactive';
 }

编辑:让我们尝试进一步分解它...类似于您的示例

 if(!in_array($template_name,$allowed_templates){
     echo "not in templates,";
 }
 if(!in_array($page_id,$allowed_ids)){
     echo "not in ids,";
 }
 if(!in_array($template_name,$allowed_templates) && !in_array($page_id,$allowed_ids)){
     echo "not in both'n";
 }

然后看看我们是否得到一个有not in templates,not in ids,但没有尾随not in both

的结果

这个问题纯粹是合乎逻辑的。让我们看看这个语句:

if (in_array($template_name,$allowed_templates)==false && in_array($page_id,$allowed_ids)==false)

翻译为"如果模板无效页面无效"

这意味着需要同时满足这两个语句才能将会话标记为非活动状态。如果模板没问题,但页面无效怎么办?这绝对也应该标记为非活动。

通过将语句更改为"如果模板无效页面无效",我们掩盖了无效的情况。因为它们中的任何一个都算作无效状态,因此,只有其中一个需要为 false 才能使所有内容都为假。(OR语句)

所以在代码方面将是

if (in_array($template_name,$allowed_templates)==false || in_array($page_id,$allowed_ids)==false)

你已经准备好了。

作为和补充。我会按照您指出的工作来构建代码。哪个更合乎逻辑。也就是说,只要应将其视为非活动状态,就将其标记为非活动状态,在所有其他情况下,将其标记为"活动"。反之亦然。