IF 语句中复合 OR 的逻辑问题,给出意外结果

logic issue with compound ORs in an IF statement giving unexpected results

提问人:Jim Babcock 提问时间:11/17/2023 更新时间:11/17/2023 访问量:64

问:

这是用 CF 编写的,但我认为这不是问题所在。虽然,我可能错了,我已经盯着看了这么久,它让我的头都扭曲了。

一般的想法是,如果数据结构未定义,或者 DS 中缺少特定成员或成员是“”,则转发到另一个页面进行修复。我通常不喜欢做否定逻辑,但在这种情况下,积极或直接接近会使 3 行 IF 子句一页长 if/then/else。

    <cfset session.returnURL = "/future/dashboard.cfm">
    <!---
    <cfset session.agentCode = "">
    --->
    <cfset session.agentCode = "123456789sd">

    <cfdump var="#(isStruct(session) neq true)#">
    <cfdump var='#(StructKeyExists(session, "agentcode") neq true)#'>
    <cfdump var='#(session.agentcode eq "")#'>
    <cfdump var=#((isStruct("session") neq true)or(StructKeyExists(session,"agentcode") neq true)
                or (session.agentcode eq ""))#>

    <cfif ((isStruct("session") neq true)  or (StructKeyExists(session, "agentcode") neq true) 
                or (session.agentcode eq ""))>
        <cfoutput>#session.agentCode#</cfoutput>
        <cfexit>
        <!--- <cflocation url="/future/security/login.cfm" addtoken="No"> --->
    </cfif>
    .
    .
    .

前三个转储按预期输出:“No No No”或“No No Yes”,具体取决于为 session.agentCode 公开的 cfset。但是当我将它们与第四个和 IF 语句中的 OR 组合在一起时,无论 3 个输入如何,它都会返回 Yes。通常,这意味着存在嵌套/优先级问题,但我没有看到它。将 3 个 No 输入到 OR 中应返回 No!

谢谢!

if-语句 冷融合

评论

0赞 Dan Bracuk 11/18/2023
您可以通过带走 . 要么始终是结构,要么未定义。此外,由于您在前几行中设置了两个变量,因此它必须是一个结构。isStruct("session") neq truesession

答:

2赞 poky 11/17/2023 #1

看起来问题是第 4 个和第 5 个转储中 isStruct 中“session”周围的引号(请注意,它们在第一个转储中不存在);如果你把它们拿走,它应该可以工作。

评论

0赞 poky 11/17/2023
另外,我建议使用!在否定陈述的前面,而不是在末尾的“neq true”;至少对我来说,它更清晰一些,而且绝对更简洁。
0赞 Jim Babcock 11/17/2023
我的天啊,谢谢!@poky我最初有过,但这已经经历了这么多次迭代我有没有提到 ThANK YOU
0赞 poky 11/18/2023
别客气!我也花了一点时间才看到它,直到我将工作的复制并粘贴到非工作的中,然后我才意识到它开始工作。容易错过!