web-dev-qa-db-fra.com

Comment soumettre plusieurs cases à cocher avec des formulaires html

J'essaie de soumettre plusieurs tableaux avec un formulaire de case à cocher mais je ne peux soumettre qu'un seul tableau pour le moment, voici ce que j'ai jusqu'à présent

Dans cet exemple, je soumets un tableau de nombres avec le delete[] tableau, ce tableau est traité correctement, je veux également soumettre le tableau condition[] cela n'est pas traité correctement, quelle est la meilleure façon de résoudre ce problème?

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

exemple de balisage 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>

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

   }
}

Tout ce que je veux, c'est être capable de passer deux tableaux à mon script php

sortie courant

100001
100002
100003

sortie souhaitée

100001   good
100002   new
100003   new
16
mk_89

Je suppose que le problème que vous rencontrez est que seules les cases à cocher cochées seront renvoyées au serveur, tandis que tous les champs masqués seront toujours être passé pour que les longueurs des tableaux diffèrent et que les clés ne correspondent pas.

La solution à cela est en fait relativement simple - il vous suffit de spécifier les clés du tableau condition afin de pouvoir faire correspondre à nouveau les valeurs. Quelque chose comme ça:

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
}

Cela lie les valeurs dans le $_POST['condition'] sauvegarde de tableau avec le $_POST['delete'] array pour que tout corresponde à nouveau.

MODIFIER

La façon dont les clés sont créées ci-dessus n'est pas géniale et, rétrospectivement, c'est la mauvaise façon de le faire.

Pour illustrer la manière correcte de le faire, imaginons que nous avons le tableau suivant, agréable et simple:

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

Ce que nous devons faire est de lier les deux entrées associées à chaque livre, ce qui signifie que nous avons besoin d'un ensemble de paires clé/valeur qui peuvent être rapprochées. Cela ressemble à un tableau pour moi. Mais contrairement à l'exemple ci-dessus, les clés ne devraient pas être pertinentes pour les données - elles n'ont pas besoin de signifier quoi que ce soit, car tout ce que nous voulons, ce sont les données.

Ce que nous devons faire est de spécifier explicitement chaque clé unique (pas de push de tableau de style pile) et de rendre les clés indépendantes des données auxquelles elles se rapportent.

Nous pouvons le faire:

$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++;
}

... puis, lorsque le formulaire est soumis, nous pouvons le faire:

// 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
}
29
DaveRandom

Je suis un peu confus au sujet de ce que vous demandez, mais je pense que je peux simplifier cela pour vous. Je ne sais pas comment vous générez les valeurs des champs cachés, sont-ils codés en dur? Quoi qu'il en soit, ce système fonctionnerait beaucoup mieux s'il était simplifié.

Essayez ceci ....

Cela combinera les informations pour les nombres et l'état, puis les divisera sur le backend pour la gestion. De cette façon, les informations sont transmises en même temps.

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


    ?>

Encore une fois, je ne sais pas si cela est utile ou non parce que j'ai un peu mal compris ce que vous tentiez exactement de réaliser, mais j'espère que cela a été utile.

2
Tabetha Moe

Vous devrez trouver un moyen créatif de transmettre plusieurs champs masqués sous forme de tableau au gestionnaire PHP, ou de modifier la façon dont ces données sont collectées. Un tableau "sérialisé" semble être le meilleur pari.

Cette réponse StackOverflow décrit vraiment ce que vous pouvez faire, et devrait toujours correspondre au comportement de votre script. Bonne chance!

1
David