43

我有一个 HTML 表单 - 使用 PHP,我将表单的数据发送到 MySQL 数据库。表格上一些问题的答案带有复选框。显然,用户不必为一个问题勾选所有复选框。我还想让其他问题(包括广播组)可选。

但是,如果我提交带有空框、单选组等的表单,我会收到一长串“未定义索引”错误消息的列表。

我怎样才能解决这个问题?谢谢。

4

8 回答 8

100

我不时使用这种技术:

<input type="hidden" name="the_checkbox" value="0" />
<input type="checkbox" name="the_checkbox" value="1" />

注意:这在不同的服务器端语言中得到不同的解释,因此如有必要,请进行测试和调整。感谢SimonSimCity的提示。

于 2009-01-24T20:05:22.647 回答
43

未选中的单选或复选框元素不会被提交,因为它们不被视为成功。因此,您必须检查它们是否使用issetorempty函数发送。

if (isset($_POST['checkbox'])) {
    // checkbox has been checked
}
于 2009-01-24T18:18:04.097 回答
7

未选中的复选框不会在 POST 数据中发送。你应该检查它是否为空:

if (empty($_POST['myCheckbox']))
     ....
else
     ....

在 PHP中empty()并且isset()不生成通知。

于 2009-01-24T18:20:14.933 回答
5

这是使用 javascript 的简单解决方法:

在提交包含复选框的表单之前,将“关闭”设置为 0 并检查它们以确保它们提交。例如,这适用于复选框数组。

///// 例子 //////

给定一个 id="formId" 的表单

<form id="formId" onSubmit="return formSubmit('formId');" method="POST" action="yourAction.php">

<!--  your checkboxes here . for example: -->

<input type="checkbox" name="cb[]" value="1" >R
<input type="checkbox" name="cb[]" value="1" >G
<input type="checkbox" name="cb[]" value="1" >B

</form>
<?php


if($_POST['cb'][$i] == 0) {
    // empty
} elseif ($_POST['cb'][$i] == 1) {
    // checked
} else {
    // ????
}

?>


<script>

function formSubmit(formId){

var theForm = document.getElementById(formId); // get the form

var cb = theForm.getElementsByTagName('input'); // get the inputs

for(var i=0;i<cb.length;i++){ 
    if(cb[i].type=='checkbox' && !cb[i].checked)  // if this is an unchecked checkbox
    {
       cb[i].value = 0; // set the value to "off"
       cb[i].checked = true; // make sure it submits
    }
}

return true;

}

</script>
于 2009-12-06T08:43:45.250 回答
3

要添加到 fmsf 的代码中,在添加复选框时,我通过在名称中包含 [] 来使它们成为一个数组

<FORM METHOD=POST ACTION="statistics.jsp?q=1&g=1">
    <input type="radio" name="gerais_radio" value="primeiras">Primeiras Consultas por medico<br/>
    <input type="radio" name="gerais_radio" value="salas">Consultas por Sala <br/>
    <input type="radio" name="gerais_radio" value="assistencia">Pacientes por assistencia<br/>
    <input type="checkbox" name="option[]" value="Option1">Option1<br/>
    <input type="checkbox" name="option[]" value="Option2">Option2<br/>
    <input type="checkbox" name="option[]" value="Option3">Option3<br/>
    <input type="submit" value="Ver">

于 2009-01-24T23:00:34.167 回答
2

用这个

$myvalue = (isset($_POST['checkbox']) ? $_POST['checkbox'] : 0;

或者用你没有价值的东西代替 0

于 2009-01-24T20:10:55.133 回答
2

我们很难检测到哪一个检查或没有检查。

如果您在 for 循环中填充表单,请使用 value 属性作为数据持有者:

    <?php for($i=1;$i<6;$i++):?>
    <input type="checkbox" name="active[]" value="<?php echo $i ?>"
    <?endfor;?>

如果提交表单,您将获得选中的复选框的订单号(在这种情况下,我选中了第 3 和第 4 个复选框):

   array(1) {       
       ["active"]=>
          array(2) {
            [0]=>       
             string(1) "3"
            [1]=>
             string(1) "4"
          }
   }

当您在循环中处理表单数据时,比如说在 post.php 中,使用以下代码来检测是否选择了相关行:

    if(in_array($_POST['active'] ,$i)) 
            $answer_result = true;
        else 
            $answer_result = false;

最终测试代码:

    <?php if (isset($_POST) && !empty($_POST)):
        echo '<pre>';
        var_dump($_POST);
        echo '</pre>';
    endif;
    ?>
    <form action="test.php" method="post">
    <?php for($i=1;$i<6;$i++):?>
    <input type="checkbox" name="active[]" value="<?php echo $i; ?>" />
    <?php endfor;?>
    <button type="submit">Submit</button>
    </form>
于 2012-03-23T10:39:41.717 回答
1

尽管提交了许多答案,但我不得不即兴创作自己的解决方案,因为我使用了自定义复选框。换句话说,没有一个答案对我有用。

我想要得到的是一组复选框,带有开和关值。诀窍是为每个复选框的开/关值提交一个分隔符。假设分隔符是“;” 所以你得到的字符串是

;, 在, ;, ;, ;

然后,一旦你得到你的帖子,只需使用“,”作为拆分字符将数据拆分为数组,然后如果数组元素包含“on”,则复选框处于打开状态,否则,它处于关闭状态。

对于每个复选框,更改 ID,其他一切都相同......并且重复的语法是:

    <div>
    <input type="hidden" name="onoffswitch" class="onoffswitch-checkbox" value=";" />
    ...some other custom code here...
    <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch1" checked>
    </div>

编辑:代替“;”,您可以使用一些 KEY 字符串值,这样您就会知道您没有弄乱顺序,一旦在服务器端获得 POST ......这样您就可以轻松创建一个 Map、Hash 或其他任何东西。PS:将它们都放在同一个 div 标签内。

于 2016-02-03T21:23:29.873 回答