【问题标题】:PHP if/else and AND/OR to check mandatory and optional fieldsPHP if/else 和 AND/OR 检查必填和可选字段
【发布时间】:2013-08-07 08:07:20
【问题描述】:

我的表单中有八个输入字段,我需要检查它们是否为空。其中四个是文本字段,另外四个是列表框。当用户提交表单时,需要填写四个文本框。第五个字段是是/否选择。如果此字段中的选择为“否”,则其余三个可以留空。但是,如果第五个字段中的选择是“是”,那么最后三个也必须使用列表框进行选择。

让我们称前四个(文本框)“mandatory-text1”、“mandatory-text2”、“mandatory-text3”和“mandatory-text4”,是/否选择列表框“yes-no”和可选选项“a”、“b”和“c”。

所以:

如果强制文本1、强制文本2、强制文本3、强制文本4为空,则处理php将中止。

但是如果强制文本1、强制文本2、强制文本3和强制文本4都填写了,接下来检查是不是包含“是”或“否”。

  • 如果它包含 a No,则 a、b 和 c 必须保留 空白的。
  • 如果它包含 a 是,那么 a、b 和 c(列表框)必须是 必须选择。

以我对 PHP 的熟练程度,我已经能够做到这一点:

    if ((mandatory-text1 || mandatory-text2 || mandatory-text3 == "") OR (yes-no == "Yes" AND (!(a || b || c  == ""))) {
    echo "blah" ;
    exit();
    }
    else {
    //do some stuff
    }

我还没有编写“做一些事情”部分,因为当我尝试此代码时,即使填写了所有文本字段,我也会收到“等等”消息,是 - 否是“是”和, b 和 c 已被选中。

我首先尝试了一个简单的“||”对于所有字段并且效果很好 - 即,即使其中一个字段留空,我也会收到“blah”消息。我也尝试过检查是-否和 a,b,c,这也可以正常工作,即如果在是-否中有一个是,如果 a,b,c 字段为空白,我会得到 blah。

但我需要满足所有条件才能进行下一步。我在 SO 上阅读的帖子将我带到了我现在所处的阶段。但是没有一个达到我想要的项目水平。

任何逻辑提示都将不胜感激!

【问题讨论】:

  • $mandatory-text1 ??或'mandatory-text1'
  • 这是 $mandatory-text1 - 我检查了原始代码。强制文本只是我这里用来解释上下文的一个伪变量!
  • 根据我的理解,您必须具体说明它失败的情况(是-否 == “是”和(!(a || b || c == “”)) ) 对于您的情况应该是 (yes-no == "Yes" AND (a || b || c == ""))。
  • @ray 我还没有达到那种清晰的程度!你看到的代码是我到目前为止所做的。我只能说当我运行原始代码时我收到了“blah”消息。即使所有字段都已填写,我也会收到一条失败消息(等等)。一旦我尝试吉姆的建议,我就会回来......

标签: php if-statement operators


【解决方案1】:

首先,你应该在变量名之前使用 $

第二, mandatory-text1||mandatory-text2||mandatory-text3=="" 是错误的逻辑。应该是$mandatory-text1=""||$mandatory-text2==""|| ...

之所以有效,是因为单独使用 if(mandatory-text1) 意味着如果定义了强制文本 1 并且不是空字符串或空字符串,因此在这种情况下单独使用 $mandatory-text1||$mandatory-text2||$mandatory-text3 就足够了

if ((mandatory-text1 || mandatory-text2 || mandatory-text3 == "") OR (yes-no == "Yes" AND (!(a || b || c  == ""))) {
echo "blah" ;
exit();
}
else {
//do some stuff
}

a||b||c 也一样

【讨论】:

    【解决方案2】:
    (mandatory-text1 || mandatory-text2 || mandatory-text3 == "")
    

    这并不像你想象的那样工作。这说:

    如果强制文本1不为空或强制2文本不为空或强制3文本等于''。

    试试:

    (mandatory-text1 == "" || mandatory-text2 == "" || mandatory-text3 == "")
    

    【讨论】:

    • 所以,如果我理解正确的话——我写的 if 语句只是为强制文本 3 做我想要的——对吧?
    • 还有——请提示一下——是否可以在单个 if 语句中执行所有检查?还是我需要嵌套的 ifs?
    • @vinaya 正确。您可以使用单个 if 语句,但如果您认为嵌套 if 会使代码更易于阅读,则可以使用。
    • 我已经尝试了你的建议,它适用于所有场景。 @Huge 的建议看起来也可行。所以虽然我现在要使用你的建议,但我可能会接受他的建议,因为它可能更适合维护......谢谢!
    【解决方案3】:

    如果我理解正确,这样的事情应该可以工作。不要在变量名中使用破折号。

    if ($mandatory1 && $mandatory2 && $mandatory3 && $mandatory4)
    {
        if ($choice == "Y" && $a && $b && $c)
        {
            // do whatever
        }
        elseif ($choice == "N" && !$a && !$b && !$c)
        {
            // do something else
        }
    }
    else
    {
        // submission incorrect
    }
    

    【讨论】:

    • (只是为了澄清)当您说 if ($choice == "Y" && $a && $b && $c) 我将其阅读为正确时 - $choice 包含值 Y 和$a、$b 和 $c 包含一些值?我仍在学习,如果(某事)有点混乱,我会觉得这很混乱!
    • 基本上是的。如果$a 不是null、不是空字符串、不是空数组、不是布尔值false,则if ($a) 将是true,依此类推。见here
    【解决方案4】:

    您可以以更易读的方式重新设计您的控件,为每个字段类型使用一个函数或代码块,例如:

    <?php
    
    
    function checkFields( $data )
    {
        // List of field to check
        $fields = array( 'mandatory-text1', 'mandatory-text2', 'mandatory-text3', 'mandatory-text4', 'a', 'b', 'c' );
    
        foreach ($fields as $field )
        {
            switch( $field )
            {
                case 'mandatory-text1':
                case 'mandatory-text2':
                case 'mandatory-text3':
                case 'mandatory-text4':
                    if ( $data[$field] == '' )
                    {
                         return false;
                    }
                break;
    
    
                case 'a':
                case 'b':
                case 'c':
                    if ( $data['yes-no'] == 'yes' && $data[$field] == '' )
                    {
                        return false;
                    }
                    elseif( $data['yes-no'] == 'no' && $data[$field] != '' )
                    {
                        return false;
                    }
                break;
            }
        }
    
        // If we have not returned false so far, then all is clear
        return true;
    }
    
    // Usage :
    if( checkFields( $_POST ) )
    {
        // every thing is ok
    }
    else
    {
        // bad submission
    }
    ?>
    

    你应该在这里避免两件事:

    • 长 AND / OR 语句
    • 使用 smae 控件重复自我

    【讨论】:

    • 我喜欢这个! @Huge ...我在 48 岁(年龄)之后开始编程,发现理解一些概念真的很棘手!开关盒就是其中之一。我想我终于明白了——非常感谢!我不知道我是否会在这个项目中使用它 - 但我肯定会支持它......
    • 这是正确的吗? - function checkFields( $data ) // 用法:if( checkFields( $_POST ) ) 还是这里有错字?
    • 是的,它是正确的,$_POST 是 PHP 为您输入的内容提供的变量。 $data 是赋予函数参数的任意名称。当您调用 chekFields( $_POST ) 时,$data 在函数内部包含 $_POST 的值(并且在函数外部不存在)。
    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2014-03-04
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多