Obtenez $ _POST à ​​partir de plusieurs cases à cocher

159

J'ai 1 formulaire avec plusieurs cases à cocher (chacune avec le code):

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

$row['Report ID']est une clé primaire dans une base de données - donc chaque valeur est différente.

Comment pourrais-je savoir quelles cases ont été cochées? (Peut-être plusieurs)

Ceci est pour un système de boîte de réception et j'ai un bouton ci-dessous que je veux (lorsque vous cliquez dessus) pour supprimer tous les messages (identifiants de:) $row['Report ID']dont la case est cochée.

James Andrew
la source

Réponses:

334

Définissez le nom du formulaire sur check_list[]et vous pourrez accéder à toutes les cases à cocher sous forme de tableau ( $_POST['check_list'][]).

Voici un petit échantillon comme demandé:

<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
la source
4
Pouvez-vous me donner un exemple de case à cocher echo (ing) one check_list []? (Et serait-ce similaire pour deux sélectionnés?) Merci.
James Andrew
2
Je devrais également préciser que si aucune valeur n'est définie dans le HTML, $checksera égal on.
Sean Walsh le
9
if($_POST)- inutile, $_POSTsera toujours vrai. Vous devriez vérifier si à la !empty($_POST['check_list'])place.
Mārtiņš Briedis
3
@ MārtiņšBriedis qui entraînerait un index de tableau hors limites s'il n'existait pas. Un meilleur contrôle seraitarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid
2
@Tyzoid empty()ne provoque pas cette erreur. Du manuel:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis
22

Modifier Pour refléter ce que @Marc a dit dans le commentaire ci-dessous.

Vous pouvez faire une boucle sur toutes les valeurs publiées.

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
}
Scone
la source
1
Erreur étrange: Avertissement: Argument non valide fourni pour foreach () dans /home1/mountgam/public_html/zombiewrath/reports.php sur la ligne 30 = /
James Andrew
2
Cela ne fonctionnerait que si vous utilisez la []syntaxe dans la définition de champ, ce qui oblige PHP à créer cette valeur $ _POST sous forme de tableau. Sinon, ce sera une seule valeur non-tableau, provoquant l'explosion de la boucle foreach ().
Marc B
1
J'ai essayé les deux, mais je vais réessayer (sans [] sous forme / nom)
James Andrew
16

vous devez nommer vos cases à cocher en conséquence:

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

vous pouvez alors accéder à toutes les cases cochées avec

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

ps. assurez-vous d'échapper correctement à votre sortie ( htmlspecialchars())

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

Et après la publication, vous pouvez les parcourir en boucle:

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

Ou obtenez une certaine valeur publiée à partir de la page précédente:

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

Désolé, ancien sujet, mais c'est un élément important à mentionner pour cela, avec lequel @JamesRattray et d'autres avaient des problèmes.

Ne fermez PAS vous-même la inputbalise (en utilisant />) lorsque vous essayez de publier plusieurs valeurs dans le script PHP. Lorsque vous fermez vous-même la balise, cela termine la définition du tableau et vous n'aurez qu'une seule valeur publiée dans votre script lors de la soumission. En effet, la réponse de @Scone peut ne pas fonctionner tant que le/> n'est pas modifié.

C'est ce qui cause le Warning: Invalid argument supplied for foreach() in /home1/... erreur PHP dans ce cas.

EDIT: Comme indiqué dans les commentaires ci-dessous, d'autres recherches suggèrent que cela dépend de DOCTYPE. Si vous avez défini DOCTYPE pour XHTML, il faudra que la balise d'entrée soit fermée. Si vous avez un ensemble DOCTYPE de HTML5, il faudra que la balise d'entrée ne soit pas fermée. Il est également possible que cela soit dicté par le navigateur dans lequel l'utilisateur consulte la page et par la façon dont il suit le DOCTYPE spécifié dans le code.

Jon Gallup
la source
Incorrect. La balise d'entrée à fermeture automatique n'affectera pas les valeurs transmises à PHP.
Raptor le
@Raptor Lors de recherches plus poussées, oui, cela peut affecter ET comme vous le dites, non. mais sur des recherches plus poussées, il n'est affecté que si le DOCTYPE est défini. HTML5 ne reconnaît pas la balise comme étant fermée (et serait invalide si elle est fermée), alors que XHTML nécessite que la balise soit fermée. Voir la page d'informations de W3Schools ici: lien
Jon Gallup
@Raptor Bien que la W3Schools puisse être pleine d'erreurs, il est important de noter que les informations qu'elle (et d'autres sites Web) peuvent fournir sont pertinentes pour la question. Je dis simplement que dans le processus de dépannage de quelque chose, TOUTE information pour essayer de résoudre un problème vaut mieux que AUCUNE information. Dans ce cas, si vous souhaitez une autre référence, le W3 spécifie que la balise d'entrée ne doit en aucun cas être fermée car elle ne sera pas conforme. Je modifierai ma réponse originale pour refléter DOCTYPE.
Jon Gallup
5

C'est assez simple. Faites attention et vous l'aurez tout de suite! :)

Vous allez créer un tableau html, qui sera ensuite envoyé au tableau php. Votre code html ressemblera à ceci:

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

[1] [2] [3]sont les IDs de vos messages, ce qui signifie que vous allez echovotre$row['Report ID'] à leur place.

Ensuite, lorsque vous soumettez le formulaire, votre tableau PHP ressemblera à ceci:

print_r($check_list)

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

Selon ceux qui ont été vérifiés et ceux qui ne l'ont pas été.

Je suis sûr que vous pouvez continuer à partir de maintenant.

Richard Rodriguez
la source
6
N'oubliez pas que check_list[]cela commencerait par check_list[0]plutôt que check_list[1].
Arbiter
1
value = "vérifié" est contre-productif. Si aucune valeur n'est spécifiée, vous obtenez «on». L'avantage de spécifier les valeurs que vous souhaitez soumettre dans les attributs de valeur est que vous pouvez envoyer des données presque arbitraires qui ne doivent pas nécessairement devenir un index de tableau PHP. Itérer sur des valeurs de tableau avec foreach est également plus facile que d'itérer sur les clés.
Rudiger W.
0

En mi caso necesito que venga en un sólo valeur, 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
la source