【问题标题】:Submit an HTML form with empty checkboxes提交带有空复选框的 HTML 表单
【发布时间】:2010-10-03 08:23:00
【问题描述】:

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

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

我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: php html forms checkbox


    【解决方案1】:

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

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

    ;, on, ;, ;, ;

    然后,一旦你得到你的帖子,只需将数据拆分为数组,使用“,”作为拆分字符,然后如果数组元素包含“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 标签内。

    【讨论】:

      【解决方案2】:

      我不时使用这种技术:

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

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

      【讨论】:

      • 依靠网络浏览器来尊重页面上成功表单元素的顺序,而你的服务器端脚本也尊重它是自找麻烦。
      • 它适用于我遇到的所有浏览器。这似乎也不会改变。
      • 你应该得到更好的评价。让我们做一些研究!从 HTML 4.01 规范看“17.13.3 处理表单数据” 第二步:构建表单数据集。 “表单数据集是一系列控件名称/当前值对......”。序列意味着逻辑顺序(您可以在任何地方查找),因此您的目的甚至可能是标准的目的。尽管它并非没有缺陷,但我很想立即开始使用它。
      • 我的问题比这里建议的要复杂一些,但是您的解决方案非常适合我的需求。
      • 如果您在 PHP 以外的其他系统中寻找解决方案,您可能需要切换它以使其正常工作:)
      【解决方案3】:

      我们很难检测出哪一个被选中。

      如果您在 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>
      

      【讨论】:

        【解决方案4】:

        使用这个

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

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

        【讨论】:

        • 为什么不简单地使用false 作为'0'?
        【解决方案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>
        

        【讨论】:

          【解决方案6】:

          要添加到 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">
          

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              【解决方案8】:

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

              if (isset($_POST['checkbox'])) {
                  // checkbox has been checked
              }
              

              【讨论】:

              • 在表单中你需要确保复选框元素设置了一个值,否则一些用户代理也不会认为复选框成功。
              猜你喜欢
              • 1970-01-01
              • 2012-02-29
              • 2021-10-29
              • 2021-06-25
              • 2021-05-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多