【问题标题】:How to validate a checkbox input using PHP?如何使用 PHP 验证复选框输入?
【发布时间】:2014-10-29 15:05:45
【问题描述】:

我的表单中有两个复选框:

<div class="label-input-wrapper pickup">    
        <div class="form-label">I need Airport pick-up</div>
        <div class="form-input">
            <input type="checkbox" name="pick_up" value="Yes" />Yes 
            <input type="checkbox" name="pick_up" value="No" />No
            <div class="error-msg">
                <?php if(isset($errors['pick_up_no'])) { echo '<span style="color: red">'.$errors['pick_up_no'].'</span>'; } ?>
            </div>
        </div>
</div>  

保存上述复选框值的变量:$pickup = $_POST['pick_up'];

验证:

//Check the airport pickup and make sure that it isn't a blank/empty string.
        if ($pickup == ""){
            //Blank string, add error to $errors array.        
            $errors['pick_up_no'] = "Please let us know your airport pick up requirement!";
        }       

        if (($pick_up = Yes) && ($pick_up = No)) {
            //if both selected, add error to $errors array.        
            $errors['pick_up_no'] = "Can not select Yes and No together!";
        }

但是如果两者都没有被选中,或者如果只选择了一个,或者两者都被选中,那么上面的验证只会打印Can not select Yes and No together!。它为所有选择提供相同的错误消息。为什么?

【问题讨论】:

  • nop.. 我只想使用复选框.. 我喜欢这个名字@Ghost
  • 您应该将值 Yes 和 No 视为字符串 - 所以在它们周围加上引号!
  • @Adimeus 我已更改为if (($pick_up = "Yes") &amp;&amp; ($pick_up = "No")),但结果仍然相同。
  • @RatanK 我已经用你的代码更新了。现在,如果两者都未选中,它会显示正确的错误消息。如果两者都被选中,它就不会打印任何内容。
  • @RiffazStarr Ghost 的回答有效(对我来说)。以为你想知道,但我仍然觉得应该使用单选按钮。

标签: php html checkbox


【解决方案1】:

您目前正在分配一个 = 符号,而不是比较 ==

if (($pick_up = Yes) && ($pick_up = No))

你需要改成

if (($pick_up == "Yes") && ($pick_up == "No")){...}

同时将YesNo 包含在引号内以便被视为字符串。


编辑:

您最好的选择是使用单选按钮,恕我直言。

不应使用复选框同时为用户提供“是”和“否”选项;很混乱。

应该是Yes No,而不是

<input type="radio" name="pick_up" value="Yes" />Yes 
<input type="radio" name="pick_up" value="No" />No

这是最可行的解决方案。

【讨论】:

  • 我已更新为if (($pick_up == "Yes") &amp;&amp; ($pick_up == "No")) { //if both selected, add error to $errors array. $errors['pick_up_no'] = "Can not select Yes and No together!"; },但如果选择了机器人,它只会打印任何内容..
  • 我已使用 if (($pick_up == "Yes") || ($pick_up == "No")) 进行了编辑,尝试使用 OR 运算符 @RiffazStarr 或查看 Ghost 的答案。
  • 另外,正如 Ghost 在他的回答中所说,您需要将两个复选框分配为 name="pick_up[]" 以被视为一个数组。 @RiffazStarr 您是否将 Ghost 的答案与我的一起尝试?
  • @Ghost 我现在没有时间花在这上面了。 OP 最好使用单选按钮,恕我直言。我不确定 OP 是否尝试过你的。我得稍后再回来看看我能不能让它工作。
  • 感谢您的所有努力@Fred-ii- 我按照建议将复选框更改为单选按钮。现在它工作正常。所以我投票赞成你的回答并接受他的回答。
【解决方案2】:

我不知道你为什么需要一个复选框(这是单选按钮应该做的),但你可以这样做:

if(!isset($_POST['pick_up']) || count($_POST['pick_up']) > 1) {
    echo 'please select at least 1 choice';
} else {
    echo $_POST['pick_up'][0];
}

然后为你的复选框命名:

name="pick_up[]"

或者,如果您确实需要单独的错误消息。做这样的事情:

$errors['pick_up_no'] = '';
if(!isset($_POST['pick_up'])) {
    $errors['pick_up_no'] = "Please let us know your airport pick up requirement!";
} elseif(count($_POST['pick_up']) > 1) {
    $errors['pick_up_no'] = "Can not select Yes and No together!"; // weird UX, should have prevented this with a radio button
}

if($errors['pick_up_no'] != '') {
    echo $errors['pick_up_no'];
} else {
    echo $_POST['pick_up'][0];
}

【讨论】:

  • 我倾向于认为这会起作用,尽管我还没有测试过。 OP是否应该提供一些输入。我正在做某事,所以我稍后会回来告诉你,如果有的话,我肯定会 +1 ;) 但我倾向于认为单选按钮是一个更可行的选择,正如我所指出的在我的编辑中。恕我直言,是和否的复选框没有意义。
  • @Fred-ii- 是的,实际上我在发布之前对此进行了测试,但我也同意你的观点,这应该是一个单选按钮,毫无疑问,这对于用户体验来说很奇怪,实际上选择两者是没有
  • 这归结为一个“希望洗白”的决定,哈哈 - 是 否。 8点来接我,别迟到哈哈哈!
  • @Fred-ii- 其实我最初的答案是使用单选按钮,这是最合乎逻辑的。无论如何,希望用户尝试一下。
【解决方案3】:

$_POST['pick_up'] 不可能同时为 yes 和 no,因为名称是 pick_up 而不是 pick_up[]

【讨论】:

  • 跟随此并转换复选框的名称pick_up[]并像这样更改if (($pick_up == 'Yes') &amp;&amp; ($pick_up == 'No'))
  • 为什么我在这件事上被否决了。我的回答绝对正确。按照他目前的代码,_POST 参数不可能同时包含 yes 和 no。
【解决方案4】:

使用复选框字段元素数组;

<input type="checkbox" name="pick_up[]" />Yes 
<input type="checkbox" name="pick_up[]" />No

然后在你的 PHP 脚本中:

<?php

$pick_ups=$_POST['pick_up'];

$first=isset($pick_ups[0]); //true/false of first checkbox status
$second=isset($pick_ups[1]); //true/false of second checkbox status

?>

同样,正如您已经被告知的,您应该为此使用单选按钮!考虑到 $_POST 如果未设置则不会发送复选框(检查 isset($_POST['name'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 2015-07-01
    • 2011-08-03
    • 2013-09-05
    • 2011-10-11
    • 2018-10-24
    • 2011-12-11
    • 2016-10-07
    相关资源
    最近更新 更多