【问题标题】:How get value for unchecked checkbox in checkbox elements when form posted?表单发布时如何获取复选框元素中未选中复选框的值?
【发布时间】:2013-10-14 21:27:21
【问题描述】:

我有如下表格:

<form action="" method="post">
    <input type="checkbox" id="status_1" name="status_1" value="1" />
    <input type="checkbox" id="status_2" name="status_2" value="1" />
    <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>

当我选中所有复选框并发布表单时,结果是这样的:

Array ([status_3] => 1 [status_2] => 1 [status_1] => 1 ) 

然后我取消选中第二个复选框并发布表单,结果是这样的:

Array ( [status_3] => 1 [status_1] => 1 ) 

当我取消选中第二个复选框时,是否可以得到如下结果:

Array ( [status_3] => 1 [status_2] => 0 [status_1] => 1 ) 

有想法吗?

【问题讨论】:

  • 创建一个同名的隐藏字段,这样会被贴出来
  • @RoyalBg :好主意,它有效.. :)
  • 我对此有疑问...未选中框的隐藏字段也将通过 tru 形式。你是怎么做到的?
  • 我试过你的想法,但隐藏的文本框也被传递了

标签: php arrays forms


【解决方案1】:

你为什么把它放在一个数组中? 您可以使用“isset”将未选中的框设为 0

    if(!isset($_POST['status_2'])
    {
      //Set status_2 parameter as 0
    }

【讨论】:

    【解决方案2】:

    我认为不可能从 html 表单中获得您想要的数组。但是可以使用一些技巧:

    $defaultForm = array(
    'status_1' => 0,
    'status_2' => 0,
    'status_3' => 0, 
    );
    
    // example array from $_POST
    $form = array(
    'status_1' => 1,
    'status_3' => 1, 
    );
    
    $form = array_merge($defaultForm, $form);
    

    结果:

    数组(3) {

    'status_1' => int(1)
    'status_2' => int(0)
    'status_3' => int(1)

    }

    【讨论】:

      【解决方案3】:

      试试这个。如果复选框没有被选中,那么会改为传递同名的隐藏字段。

      <form action="" method="post">
        <input type="hidden" id="hidden_status_1" name="status_1" value="0" />
        <input type="checkbox" id="status_1" name="status_1" value="1" />
        <input type="hidden" id="hidden_status_2" name="status_2" value="0" />
        <input type="checkbox" id="status_2" name="status_2" value="1" />
        <input type="hidden" id="hidden_status_3" name="status_3" value="0" />
        <input type="checkbox" id="status_3" name="status_3" value="1" />
      </form>
      

      【讨论】:

        【解决方案4】:

        我认为添加这样的隐藏字段会起作用

        <input type="hidden" id="status_1_" name="status_1"  value="0">
        <input type="checkbox" id="status_1" name="status_1" value="1" />
        
        <input type="hidden" id="status_2_" name="status_2" value="0">
        <input type="checkbox" id="status_2" name="status_2" value="1" />
        
        <input type="hidden" id="status_3_" name="status_3" value="0">
        <input type="checkbox" id="status_3" name="status_3" value="1" />
        

        【讨论】:

        • 请记住,HTTP 请求将包含这两个值。删除第一个值的是 PHP 解析器。
        • @JosefKufner 谢谢,你是对的。但这是许多 php 框架(如 CakePHP)使用的方法。
        • 我并不是说这是错误的。只是知道“0”值在哪里丢失很重要,因为它可能会导致一些意想不到的副作用。
        【解决方案5】:

        谢谢大家。感谢@RoyalBg 给我解决方案。像这样:

        <input type="hidden" name="status_1" value="0" />
        <input type="checkbox" id="status_1" name="status_1" value="1" /> Check 1 <br />
        <input type="hidden" name="status_2" value="0" /> 
        <input type="checkbox" id="status_2" name="status_2" value="1" /> Check 2 <br />
        <input type="hidden" name="status_3" value="0" />
        <input type="checkbox" id="status_3" name="status_3" value="1" /> Check 3 <br />
        

        效果很好.. :)

        【讨论】:

          【解决方案6】:

          第一种方式 - 隐藏字段(缺点:用户可以操作字段的值(但也可以操作复选框的值,所以如果您只期望 1 或 0,这不是问题)

          <form action="" method="post">
          <input type="hidden" name="status_1" value="0" />
          <input type="checkbox" id="status_1" name="status_1" value="1" />
          <input type="hidden" name="status_2" value="0" />
          <input type="checkbox" id="status_2" name="status_2" value="1" />
          <input type="hidden" name="status_3" value="0" />
          <input type="checkbox" id="status_3" name="status_3" value="1" />
          <input type="submit" />
          </form>
          <?php
          var_dump($_POST);
          /*
           * checking only the second box outputs:
           * 
           * array (size=3)
            'status_1' => string '0' (length=1)
            'status_2' => string '1' (length=1)
            'status_3' => string '0' (length=1)
           */
          

          第二种方式 - 为未设置的索引分配默认值:

          <form action="" method="post">
          <input type="checkbox" id="status_1" name="status_1" value="1" />
          <input type="checkbox" id="status_2" name="status_2" value="1" />
          <input type="checkbox" id="status_3" name="status_3" value="1" />
          <input type="submit" />
          </form>
          <?php
          for($i = 1; $i<=count($_POST); $i++) {
              $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0;
          }
          var_dump($_POST);
          
          /**
           * Here we will be checking only the third checkbox:
           * 
           * array (size=3)
            'status_3' => string '1' (length=1)
            'status_1' => int 0
            'status_2' => int 0
           */
          

          【讨论】:

          • 值得注意的是 a) 如果您希望服务器端正确地从输入中恢复所有输入,而不需要额外的、预先建立的知识(参见例如动态生成的表单),第一种技术几乎是唯一的方法在客户端),并且 b)重复的名称值与规范很好(尽管我在规范中找不到 normative 位置以仅链接到,但请参见此处:html.spec.whatwg.org/multipage/… )。
          • @Royal Bg 这里发生了任何基于优先级的事情吗?我的意思是如果设置了复选框的值,它如何决定取哪个值(复选框或隐藏输入)?
          • 是的,优先级取决于它们如何发送到服务器。基本上是 HTML 格式,它们是依次发送的。从第一个输入到最后一个。这意味着首先将发送隐藏字段,然后发送复选框(如果存在)。如果未发送复选框,则会发生隐藏。但是如果发送复选框,它将覆盖隐藏字段。如果您更改它们的位置(例如,第一个复选框,然后隐藏),那么只有隐藏字段会覆盖复选框。
          • 是的。那就是问题所在。我的情况正好相反。当我将其保持对立时(第一个复选框,然后隐藏),它对我来说工作正常。我正在编写jsp文件。你能解释一下吗?
          • 这可能是因为框架。我猜http请求上下文中的哈希表不支持覆盖值,但只是不放第二个值。在本机场景中,所有key=&gt;value 对都被发送,而不是相等的键。不同框架如何处理重复键和填充请求对象是特定于字段的。 JSP 不是已经死了吗?
          【解决方案7】:

          这个问题可能已经回答了,但我只是想试一试……服务器端唯一的解决方案:

          $p = $_POST;
          $a = array();
          $a['status_3'] = (int) ($p['status_3'] === 1);
          $a['status_2'] = (int) ($p['status_2'] === 1);
          $a['status_1'] = (int) ($p['status_1'] === 1);
          

          测试

           // if input is Array("status_1"=>1) output will be
           Array ( [status_1] => 1 [status_3] => 0 [status_2] => 0 )
          
           // if input is Array("status_1"=>1, "status_2"=>1) output will be
           Array ( [status_1] => 1 [status_3] => 0 [status_2] => 1)
          

          【讨论】:

            【解决方案8】:

            试试下面的代码

                $myresult = array();
            
                if(!isset($_POST['status_1'])){ 
                    $myresult['status_1'] = 0;
                }
                if(!isset($_POST['status_2'])){ 
                    $myresult['status_2'] = 0;
                }
                if(!isset($_POST['status_3'])){ 
                    $myresult['status_3'] = 0;
                }
            
                echo "<pre>";
                print_r($myresult);
                echo "</pre>";
                exit;
            

            【讨论】:

              【解决方案9】:

              试试这个:

              for ($i = 1; $i<=3; $i++) {
                  $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0; // 0 if not set
              }
              
              var_dump($_POST);
              

              【讨论】:

                【解决方案10】:

                假设我们使用带有 0 或 1 的复选框...

                使用零值的隐藏复选框只是一种解决方法。另一种解决方法是在收到 post 或 get 时将值加 0。

                例子:

                $chkbx1 = $_POST['chckbx1']; $chkbx1 += 0;

                这需要一个 NULL 值并将其变为零,但如果该值为 1,如在其检查中,则该值保持不变。

                这里真正的问题不是发明一种变通方法。它理解为什么会发生这种情况。旧版本的 mySQL 采用空值并将它们转换为零。在较新的版本中,您必须禁用严格模式,然后就不需要解决方法了。

                【讨论】:

                【解决方案11】:
                <!--html code-->                                                                  
                <input type="checkbox" name="correct" value="1">Option 1
                <input type="checkbox" name="correct" value="2">Option 2
                <input type="checkbox" name="correct" value="3">Option 3
                <input type="checkbox" name="correct" value="4">Option 4                                   
                
                //php code in function called on form submit       
                  public function addOptions(Request $request)
                   {
                    $option = array('1' => 0,'2'=>0,'3'=>0,'4'=>0 );
                    $option[$request->correct] = 1;
                    return $option;
                   }
                

                【讨论】:

                  猜你喜欢
                  • 2013-05-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-15
                  • 1970-01-01
                  • 2015-01-31
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多