【问题标题】:How to submit multiple array checkbox with html forms如何使用 html 表单提交多个数组复选框
【发布时间】:2012-08-02 23:18:29
【问题描述】:

我正在尝试使用复选框表单提交多个数组,但目前我只能提交一个数组,这是我目前所拥有的

在这个例子中,我提交了一个带有delete[]数组的数字数组,这个数组得到了正确处理,我还想提交数组condition[]这没有得到正确处理,最好的解决方法是什么这个问题?

php 代码

$catalog = $database->getInventory();

if($catalog){   
   $numRows = sizeof($catalog);//count
   echo "<b>Book Count:</b> ".$numRows."<br>";

   echo "<form method='post' action='inventory.php'>";
   echo "<table id='example' class='tablesorter' border='0' cellpadding='0' cellspacing='1'>";
   echo "
      <thead>
         <tr>
           <th>ISBN</th>        
           <th>Title&nbsp;&nbsp;&nbsp;</th>
           <th>Rank&nbsp;&nbsp;</th>
           <th>Condition&nbsp;&nbsp;</th>   
           <th><input type='checkbox' name='delete' value='all' /></th>
         </tr>
      </thead>\n";


   foreach($catalog as $elem){
      echo "
         <tr>
            <td>".$elem["isbn"]."</td>
            <td>".$elem["title"]."</td>
            <td>".$elem["rank"]."</td>
            <td>".$elem["condition"]."</td>
            <td> 
               <input type='checkbox' name='add[]' 
                  value='".$elem['isbn']."_".$elem['condition']."_"."' />
            </td>
         </tr>";    
   }

   echo "</table>";
   echo "</form>";
}

示例 html 标记

<form method='post' action='inventory.php'>
   <table>
      <tr>
         <td>
            <input type='hidden' name='addInventoryBook' value='1'>
            <input type='submit' value='Add' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='add[]' value='100001_used' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='add[]' value='100001_new' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='add[]' value='100003_new' />
         </td>
      </tr>

   </table>
</form>

php函数

function Inventory(){   
   if(isset($_POST['addInventoryBook'])){
      if(isset($_POST['add']) && is_array($_POST['add'])){
     $arr = array();
         foreach($_POST['add'] as $checkbox){
            $temp = explode("_", $checkbox);

            $arr[] = array(
               "isbn"       => $temp[0],
               "condition"      => $temp[1],
               "sub_condition"  => $temp[2]
            );
         }              
     $this->addInventoryBook($arr); 
      }

      else{
         echo "No values have been set";
      }
 }


function addInventoryBook($arr){
   foreach($arr as $elem){
      //if used get sub-category
      if($elem['condition']=='used'){
         echo $elem['isbn']."-".ucfirst($elem['condition'])
            .ucfirst($elem['sub_condition'])."<br>";
      }

      else if($elem['condition']=='new'){
         echo $elem['isbn']."-".ucfirst($elem['condition'])."<br>";
      }

   }
}

我想要的只是基本上能够将两个数组传递给我的 php 脚本

电流输出

100001
100002
100003

期望的输出

100001   good
100002   new
100003   new

【问题讨论】:

  • 我很困惑你在问什么。我在你的代码中没有看到$_POST['condition'],所以我不确定你在问什么。
  • 我不确定 [] 技巧是否也适用于隐藏字段..
  • @David 我试图让 ['condition'] 工作,例如foreach($_POST['condition'] as $checkbox) echo $checkbox."&lt;br&gt;"; 但这不起作用
  • 您需要更详细地解释您的问题,并改写它,因为阅读和完全理解您想要的内容可能会非常混乱......
  • @favoretti 你知道一种可行的方法

标签: php html forms


【解决方案1】:

我怀疑您遇到的问题是,只有选中的复选框才会被传递回服务器,而 all 隐藏字段将始终被传递,因此数组会有所不同,键不会对应。

解决这个问题的方法其实比较简单——你只需要为condition数组指定键,这样你就可以再次匹配这些值。像这样的:

HTML:

  <tr>
     <td>
        <input type='hidden' name='condition[100001]' value='good' />
        <input type='checkbox' name='delete[]' value='100001' />
     </td>
  </tr>

  <tr>
     <td>
        <input type='hidden' name='condition[100002]' value='new' />
        <input type='checkbox' name='delete[]' value='100002' />
     </td>
  </tr>

PHP:

foreach ($_POST['delete'] as $delete) {
  $condition = $_POST['condition'][$delete];
  // Do stuff
}

这会将$_POST['condition'] 数组中的值与$_POST['delete'] 数组联系起来,因此一切都会再次匹配。

编辑

上面创建密钥的方式不是很好,回想起来这是错误的方式。

为了演示正确的方法,让我们假设我们有以下数组,既漂亮又简单:

$books = array(
  10001 => 'good',
  10002 => 'new',
  10003 => 'new',
  10004 => 'good'
);

我们需要做的是绑定与每本书相关的两个输入,这意味着我们需要一组可以匹配的键/值对。这对我来说听起来像是一个数组。但与上面的示例不同,键应该与数据无关——它们不需要任何意义,因为我们想要的只是数据。

我们需要做的是明确指定每个键(没有堆栈式数组推送)并使键与它们相关的数据无关。

我们可以这样做:

$i = 0;
foreach ($books as $isbn => $condition) {
  echo "
    <tr>
      <td>
        <input type='hidden' name='condition[$i]' value='$condition' />
        <input type='checkbox' name='delete[$i]' value='$isbn' />
      </td>
    </tr>
  ";
  $i++;
}

...然后,当提交表单时,我们可以这样做:

// We still base our code on $_POST['delete'] - because this is the array that
// depends on the user input. This time, though, we'll look at the keys as well
foreach ($_POST['delete'] as $key => $isbn) {
  $condition = $_POST['condition'][$key];
  // Do stuff
}

【讨论】:

  • 这看起来很有趣,我试试看
  • 我在您的解决方案中遇到了问题,如果有 2 本书的 ISBN 相同但条件不同,我该怎么办,我得到了一些不一致的结果。
  • @mk_89 你知道,我今天早上醒来,后悔推荐你这样做。您需要将键和值逻辑分开,这种将它们组合成一个,这不是一个好方法。您应该做的是在生成 HTML 时在循环中维护一个计数器,并使用 that 作为键。如果您使用当前生成 HTML 的 PHP 代码编辑问题,我将提供示例代码。
  • 好的,我实际上使用了不同的方法,但我使用的方法感觉像鸭带解决方案,我将更改问题和示例
  • @mk_89 我在这里所做的基本原则是合理的,它只是需要调整的更精细的点之一。请参阅上面的编辑。
【解决方案2】:

我对你的要求有点困惑,但我想我可以为你简化一下。我不知道您是如何为隐藏字段生成值的,它们是硬编码的吗?无论如何,如果简化这个系统,它会更好地工作。

试试这个....

这将结合数字和条件的信息,然后将它们在后端拆分以进行处理。这样信息是同时传递的。

<tr>
         <td>
            <input type='checkbox' name='delete[]' value='100001-good' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='delete[]' value='100002-new' />
         </td>
      </tr>

      <tr>
         <td>
            <input type='checkbox' name='delete[]' value='100003-new' />
         </td>
      </tr>

    <?php


       if(isset($_POST['deleteInventoryBook'])){
          if(isset($_POST['delete']) && is_array($_POST['delete'])){
             foreach($_POST['delete'] as $checkbox){
               $checkbox = explode('-', $checkbox);
               echo $checkbox[1];
               echo '<br />';
               echo $checkbox[0];
               echo '<br />';
             }
          }else{
             echo "No values have been set";
          }
       }


    ?>

再说一次,我不知道这是否有帮助,因为我对您想要实现的具体目标有点误解,但我希望它会有所帮助。

【讨论】:

  • 别担心,兄弟已经回答了,但感谢您的意见
【解决方案3】:

您将不得不找到一种创造性的方法来将多个隐藏字段作为数组传递给 PHP 处理程序,或者更改收集数据的方式。 “序列化”数组似乎是最好的选择。

This StackOverflow answer 确实概述了您可以做什么,并且仍应符合您脚本的行为。祝你好运!

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2021-06-25
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多