2012-08-05 12 views
11

Estoy intentando enviar varias matrices con una forma casilla de verificación, pero estoy sólo es capaz de presentar una matriz en el momento, esto es lo que tengo hasta ahoraCómo presentar casilla múltiple matriz con formularios HTML

En este ejemplo Estoy enviando una matriz de números con la matriz delete[], esta matriz se procesa correctamente, también deseo enviar la matriz condition[], esto no se procesa correctamente, ¿cuál es la mejor manera de resolver este problema?

código 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>"; 
} 

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

función 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>"; 
     } 

    } 
} 

Todo lo que quiero yo s es básicamente capaz de pasar dos matrices a mi script php

salida de corriente

100001 
100002 
100003 

salida deseada

100001 good 
100002 new 
100003 new 
+0

Estoy confundido con lo que estás preguntando. No veo '$ _POST ['condition']' en ninguna parte de tu código, así que no estoy seguro de lo que estás preguntando. – David

+1

No estoy seguro de que [] el truco se aplique a los campos ocultos, ya sea .. – favoretti

+0

@David Estoy tratando de que la ['condición'] funcione, p. 'foreach ($ _ POST ['condición'] como $ casilla de verificación) echo $ casilla de verificación"
";' pero eso no funciona –

Respuesta

22

El problema que tiene, sospecho, es que solo las casillas de verificación que se verifican se transmitirán al servidor, mientras que todos los campos ocultos siempre se pasarán, por lo que las longitudes de las matrices serán diferentes y las llaves no corresponderán

La solución a esto es en realidad relativamente simple: solo necesita especificar las claves para la matriz condition para que pueda hacer coincidir los valores de nuevo. Algo como esto:

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 
} 

Esto vincula los valores de la matriz $_POST['condition'] copia de seguridad con la matriz $_POST['delete'] así que todo va a coincidir de nuevo.

EDITAR

La forma en que las teclas se están creando anterior no es grande y en retrospectiva, es la manera incorrecta de hacerlo.

Para demostrar la derecho manera de hacerlo, imaginemos que tenemos la siguiente matriz, agradable y simple:

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

Lo que tenemos que hacer es atar las dos entradas que están asociados con cada uno libro, lo que significa que necesitamos un conjunto de pares clave/valor que se pueden combinar. Eso me suena como una matriz. Pero a diferencia del ejemplo anterior, las claves deberían ser irrelevantes para los datos; no necesitan significar nada, porque lo único que queremos son los datos.

Lo que tenemos que hacer es especificar cada clave de forma explícita (sin matriz de estilos de pila) y hacer que las claves sean independientes de los datos a los que se refieren.

Podemos hacer esto:

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

... y luego, cuando se envía el formulario, no podemos hacer esto:

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

esto se ve interesante, voy a darle una oportunidad –

+0

esto es genial se trabaja con precisión y muy bien . gracias –

+0

Me he encontrado con un problema con su solución, ¿qué debo hacer si hay dos libros con el mismo ISBN pero diferentes condiciones, he estado obteniendo algunos resultados inconsistentes. –

1

Vas a tener que encontrar una manera creativa pasar múltiples campos ocultos como una matriz al manejador PHP, o cambiar cómo se recopilan esos datos. Una matriz "serializada" parece ser la mejor opción.

This StackOverflow answer realmente delinea lo que puede hacer, y aún debe coincidir con el comportamiento de su secuencia de comandos. ¡Buena suerte!

+0

Voy a echar un vistazo –

1

Estoy un poco confundido acerca de lo que eres preguntando, pero creo que puedo simplificar esto para ti. No sé cómo está generando los valores para los campos ocultos, ¿están codificados? De todos modos, este sistema funcionaría mucho mejor si se simplificara.

Trate de hacer esto ....

Esto combinará la información de la cantidad y condición, entonces éste se parte de ellos en el backend para su manipulación. De esta manera, la información se pasa al mismo tiempo.

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


    ?> 

Una vez más, no sé si esto es útil o no, porque yo estaba un poco mal entendido acerca de qué es exactamente lo que estaba tratando de lograr, pero espero que haya sido útil.

+1

No se preocupe, ya se ha respondido, pero gracias por su contribución –

Cuestiones relacionadas