簡體   English   中英

如何使用html表單提交多個數組復選框

[英]How to submit multiple array checkbox with html forms

我正在嘗試使用復選框表單提交多個數組,但我現在只能提交一個數組,這是我到目前為止所擁有的

在這個例子中,我使用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

我懷疑,你遇到的問題是,只有被檢查的復選框才會被傳遞回服務器,而所有隱藏的字段將始終傳遞,因此數組的長度將不同,鍵也不會對應。

解決方案實際上相對簡單 - 您只需指定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
}

我對你的要求有點困惑,但我想我可以為你簡化這個。 我不知道你是如何生成隱藏字段的值,它們是硬編碼的嗎? 無論如何,如果簡化,這個系統會更好。

試試這個....

這將結合數字和條件的信息,然后將它們分割在后端進行處理。 這樣,信息就會同時傳遞。

<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";
          }
       }


    ?>

同樣,我不知道這是否有用,因為我對你究竟想要實現的目標有點誤解,但我希望它有所幫助。

您將不得不找到一種創造性的方法將多個隱藏字段作為數組傳遞給PHP處理程序,或者更改收集數據的方式。 “序列化”陣列似乎是最好的選擇。

這個StackOverflow答案確實概述了你可以做什么,並且仍然應該匹配你的腳本的行為。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM