2012-08-05 12 views
11

Próbuję przesłać wiele tablic z formularza pole wyboru, ale jestem w stanie złożyć tylko jedną tablicę w tej chwili, tutaj jest to, co mam tak dalekoJak złożyć wielokrotnego wyboru tablicy z formularzy HTML

W tym przykładzie Przesyłam tablicę liczb z tablicą delete[], ta tablica jest przetwarzana poprawnie, ja też chcę przesłać tablicę condition[] to nie zostanie poprawnie przetworzone, jaki jest najlepszy sposób na rozwiązanie tego problemu?

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

przykład html znaczników

<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> 

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

    } 
} 

Wszystko czego chcę ja s na zasadzie móc przejść dwie tablice do mojego skryptu php

prądu wyjściowego

100001 
100002 
100003 

pożądany wynik

100001 good 
100002 new 
100003 new 
+0

Jestem zdezorientowany, o co pytasz. Nie widzę "$ _POST [" warunek "] w całym kodzie, więc nie jestem pewien, o co pytasz. – David

+1

Nie jestem pewien, czy sztuczka [] dotyczy również ukrytych pól. – favoretti

+0

@David im próbuje uruchomić ['warunek'] do pracy np. 'foreach ($ _ POST ['warunek'] jako checkbox $) pole wyboru echo $."
";' ale to nie działa –

Odpowiedz

22

Podejrzewam, że problem polega na tym, że tylko zaznaczone pola wyboru zostaną przekazane z powrotem do serwera, podczas gdy ukryte pola będą zawsze przekazywane, więc długości macierzy będą się różnić i klucze nie odpowiadają.

Rozwiązanie jest w rzeczywistości stosunkowo proste - wystarczy podać klucze dla tablicy condition, aby ponownie dopasować wartości. Coś takiego:

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 
} 

To wiąże wartości w tablicy $_POST['condition'] z powrotem z tablicy $_POST['delete'] więc wszystko będzie dopasować się ponownie.

EDIT

Sposób klucze są tworzone powyżej nie jest wielki i z perspektywy czasu jest to zły sposób to zrobić.

Aby zademonstrować prawo sposób to zrobić, wyobraźmy sobie, mamy następujące tablicą, ładne i proste:

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

Co musimy zrobić, to związać się dwa wejścia, które są związane ze sobą książka, co oznacza, że ​​potrzebujemy zestawu par klucz/wartość, które można dopasować. To brzmi dla mnie jak tablica. Ale w przeciwieństwie do powyższego przykładu klucze nie powinny mieć znaczenia dla danych - nie muszą nic oznaczać, ponieważ wszystko, czego chcemy, to dane.

To, co musimy zrobić, to jednoznacznie określić każdy klucz (bez przesuwania tablicy stylów stosu) i sprawić, by klucze były nieproporcjonalne do danych, do których się odnoszą.

Możemy to zrobić:

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

... i wtedy, gdy formularz jest składany, możemy to zrobić:

// 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 
} 
+0

to wygląda interesująco, dam mu shot –

+0

to jest świetne działa dokładnie i bardzo dobrze . dzięki –

+0

Mam problem z twoim rozwiązaniem, co mam zrobić, jeśli istnieją 2 książki z tym samym numerem ISBN, ale inne warunki, otrzymałem kilka niespójnych wyników. –

1

Będziesz musiał znaleźć drogę twórczą przekazać wiele ukrytych pól jako tablicę do programu obsługi PHP lub zmienić sposób gromadzenia danych. Wydaje się, że najlepszym wyborem jest "serializowana" tablica.

This StackOverflow answer Naprawdę określa, co możesz zrobić, i powinno nadal pasować do zachowania Twojego skryptu. Powodzenia!

+0

Zajrzę –

1

jestem trochę zagubiony, kim jesteś pytając, ale myślę, że mogę to dla ciebie uprościć. Nie wiem, w jaki sposób generujesz wartości ukrytych pól, czy są one zakodowane? Niezależnie od tego system ten działałby znacznie lepiej, gdyby był uproszczony.

Spróbuj tego ....

To będzie łączyć informacje o liczbie i stanie, to będzie podzielić je na backend do manipulacji. W ten sposób informacje są przekazywane w tym samym czasie.

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


    ?> 

Ponownie, nie wiem, czy jest to pomocne, czy nie, bo było trochę źle o co dokładnie staraliśmy się osiągnąć, ale mam nadzieję, że był pomocny.

+1

Nie martw się o to, bo już zostało odebrane, ale dziękuję za twoje wejście –

Powiązane problemy