0

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

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

所以:

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

但是如果mandatory-text1、mandatory-text2、mandatory-text3、mandatory-text4都填了,接下来检查yes-no是否包含“Yes”或“No”。

  • 如果它包含一个否,那么 a、b 和 c 必须留空。
  • 如果它包含 a Yes,则必须选择 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
    }

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

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

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

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

4

4 回答 4

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 相同

于 2013-08-06T10:57:17.053 回答
1
(mandatory-text1 || mandatory-text2 || mandatory-text3 == "")

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

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

尝试:

(mandatory-text1 == "" || mandatory-text2 == "" || mandatory-text3 == "")
于 2013-08-06T10:58:08.623 回答
1

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

<?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 控件重复自我
于 2013-08-06T11:22:29.060 回答
0

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

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
}
于 2013-08-06T11:16:15.720 回答