Obtenga $ _POST de múltiples casillas de verificación

159

Tengo 1 formulario con varias casillas de verificación (cada uno con el código):

<input type="checkbox" name="check_list" value="<? echo $row['Report ID'] ?>">

Donde $row['Report ID']es una clave primaria en una base de datos, por lo que cada valor es diferente.

¿Cómo podría saber qué casillas de verificación se han marcado? (Tal vez múltiples)

Esto es para un sistema de bandeja de entrada y tengo un botón debajo que deseo (cuando se hace clic) para eliminar todos los mensajes (identificadores de:) $row['Report ID']que tienen marcada la casilla de verificación.

James Andrew
fuente

Respuestas:

334

Establezca el nombre en el formulario check_list[]y podrá acceder a todas las casillas de verificación como una matriz ( $_POST['check_list'][]).

Aquí hay una pequeña muestra según lo solicitado:

<form action="test.php" method="post">
    <input type="checkbox" name="check_list[]" value="value 1">
    <input type="checkbox" name="check_list[]" value="value 2">
    <input type="checkbox" name="check_list[]" value="value 3">
    <input type="checkbox" name="check_list[]" value="value 4">
    <input type="checkbox" name="check_list[]" value="value 5">
    <input type="submit" />
</form>
<?php
if(!empty($_POST['check_list'])) {
    foreach($_POST['check_list'] as $check) {
            echo $check; //echoes the value set in the HTML form for each checked checkbox.
                         //so, if I were to check 1, 3, and 5 it would echo value 1, value 3, value 5.
                         //in your case, it would echo whatever $row['Report ID'] is equivalent to.
    }
}
?>
Sean Walsh
fuente
44
¿Me puede dar un ejemplo de la casilla de verificación echo (ing) one check_list []? (¿Y sería similar para dos seleccionados?) Gracias.
James Andrew
2
También debo especificar que si no se establece ningún valor en el HTML, $checkserá igual on.
Sean Walsh
9
if($_POST)- inútil, $_POSTsiempre será cierto. Debe verificar si !empty($_POST['check_list'])en su lugar.
Mārtiņš Briedis
3
@ MārtiņšBriedis que causaría un índice de matriz fuera de los límites si no existiera. Una mejor verificación seríaarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid el
2
@Tyzoid empty()no causa este error. Del manual:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis
22

Editar Para reflejar lo que dijo @Marc en el comentario a continuación.

Puede hacer un ciclo a través de todos los valores publicados.

HTML:

<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />

PHP:

foreach($_POST['check_list'] as $item){
  // query to delete where item = $item
}
Bollo
fuente
1
Error extraño: Advertencia: argumento no válido proporcionado para foreach () en /home1/mountgam/public_html/zombiewrath/reports.php en la línea 30 = /
James Andrew
2
Eso solo funcionaría si usa la []sintaxis en la definición de campo, lo que hace que PHP cree ese valor $ _POST como una matriz. De lo contrario, será un único valor sin matriz, lo que hará que el bucle foreach () explote.
Marc B
1
Intenté ambos, pero está bien, lo intentaré nuevamente (Sin [] en forma / nombre)
James Andrew
16

debe nombrar sus casillas de verificación en consecuencia:

<input type="checkbox" name="check_list[]" value="…" />

entonces puede acceder a todas las casillas marcadas con

// loop over checked checkboxes
foreach($_POST['check_list'] as $checkbox) {
   // do something
}

PD. asegúrese de escapar correctamente de su salida ( htmlspecialchars())

knittl
fuente
12
<input type="checkbox" name="check_list[<? echo $row['Report ID'] ?>]" value="<? echo $row['Report ID'] ?>">

Y después de la publicación, puede recorrerlos:

   if(!empty($_POST['check_list'])){
     foreach($_POST['check_list'] as $report_id){
        echo "$report_id was checked! ";
     }
   }

O obtenga un cierto valor publicado en la página anterior:

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}
Mārtiņš Briedis
fuente
12

Lo sentimos, viejo tema, pero esta es una pieza importante para mencionar para esto, con la que @JamesRattray y otros estaban teniendo problemas.

NO cierre la inputetiqueta (usando />) cuando intente publicar varios valores en el script PHP. Cuando cierra la etiqueta, finaliza la definición de la matriz y solo tendrá un único valor publicado en su script al enviarlo. En efecto, la respuesta de @Scone puede no funcionar hasta que />se cambie.

Esto es lo que causa el Warning: Invalid argument supplied for foreach() in /home1/... error de PHP en este caso.

EDITAR: Como se señala en los comentarios a continuación, la investigación adicional sugiere que esto depende del DOCTYPE. Si tiene el DOCTYPE configurado para XHTML, requerirá que la etiqueta de entrada esté cerrada. Si tiene un conjunto DOCTYPE de HTML5, requerirá que la etiqueta de entrada no se cierre. También existe la posibilidad de que esto pueda ser dictado por el navegador en el que el usuario está viendo la página y qué tan bien sigue el DOCTYPE especificado en el código.

Jon Gallup
fuente
Incorrecto. La etiqueta de entrada de cierre automático no afectará los valores que pasan a PHP.
Raptor
@Raptor En futuras investigaciones, sí, puede afectar Y, como usted dice, no, no lo hace. pero en futuras investigaciones, solo se ve afectado si se establece DOCTYPE. HTML5 no reconoce que la etiqueta está cerrada (y no sería válida si está cerrada), mientras que XHTML requiere que la etiqueta esté cerrada. Vea la página de información de W3Schools aquí: enlace
Jon Gallup
@Raptor Si bien las W3Schools pueden estar llenas de errores, es importante tener en cuenta que la información que (y otros sitios web) pueden proporcionar es convincente para la pregunta. Simplemente estoy afirmando que, en el proceso de solución de problemas, CUALQUIER información para tratar de solucionar un problema es mejor que NINGUNA información. En este caso, si desea otra referencia, el W3 especifica que la etiqueta de entrada no debe cerrarse de ninguna manera, ya que no será compatible. Editaré mi respuesta original para reflejar DOCTYPE.
Jon Gallup
5

Es muy simple ¡Presta atención y lo recibirás de inmediato! :)

Creará una matriz html, que luego se enviará a la matriz php. Su código html se verá así:

<input type="checkbox" name="check_list[1]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[2]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[3]" alt="Checkbox" value="checked">

Donde [1] [2] [3]estan losID s de sus mensajes, lo que significa que será echosu$row['Report ID'] en su lugar.

Luego, cuando envíe el formulario, su matriz PHP se verá así:

print_r($check_list)

[1] => checked [3] => checked

Dependiendo de cuáles fueron verificados y cuáles no.

Estoy seguro de que puede continuar desde este punto en adelante.

Richard Rodriguez
fuente
66
Recuerde que check_list[]comenzaría con check_list[0]más que con check_list[1].
Árbitro
1
value = "marcado" es contraproducente. Si no se especifica ningún valor, se activa. La ventaja de especificar los valores que desea enviar en los atributos de valor es que puede enviar datos casi arbitrarios que no tienen que convertirse en un índice de matriz PHP. Iterar sobre valores de matriz con foreach también es más fácil que iterar sobre las teclas.
Rudiger W.
0

En mi caso necesito que venga en un solo valor, por lo tanto no me vale una matriz.

    // Primero paso las matrices del post a valores separados por coma.
    foreach($_POST as $n => $v) if (is_array($v)) $_POST[$n] = implode(",", $v);

Con esto me aseguro que los valores sean 1 y separados por coma. Así en MySQL puedo hacer la consulta, venga en matriz o no:

Where id in ($_POST["id"])
Manu Burrero Sánchez
fuente