Obtenha $ _POST de várias caixas de seleção

158

Eu tenho 1 formulário com várias caixas de seleção nele (cada uma com o código):

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

Onde $row['Report ID']está uma chave primária em um banco de dados, para que cada valor seja diferente.

Como posso saber quais caixas de seleção foram marcadas? (Talvez múltiplos)

Isto é para um sistema de caixa de entrada e eu tenho um botão abaixo do qual desejo (quando clicado) excluir todas as mensagens (IDs de:) $row['Report ID']que têm a caixa de seleção marcada.

James Andrew
fonte

Respostas:

333

Defina o nome no formulário como check_list[]e você poderá acessar todas as caixas de seleção como uma matriz ( $_POST['check_list'][]).

Aqui está uma pequena amostra, conforme 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
fonte
4
Você pode me dar um exemplo de echo (ing) uma caixa de seleção check_list []? (E seria semelhante para dois selecionados?) Obrigado.
James Andrew
2
Também devo especificar que, se nenhum valor for definido no HTML, $checkserá igual on.
Sean Walsh
9
if($_POST)- inútil, $_POSTsempre será verdade. Você deve verificar se em !empty($_POST['check_list'])vez disso.
Mari Briedis
3
@ MārtiņšBriedé que causaria um índice de matriz fora dos limites se não existisse. Uma verificação melhor seriaarray_key_exists('check_list', $_POST) && !empty($_POST['check_list'])
Tyzoid
2
@Tyzoid empty()não causa esse erro. Do manual:empty() does not generate a warning if the variable does not exist.
Mārtiņš Briedis
22

Editar Para refletir o que @Marc disse no comentário abaixo.

Você pode fazer um loop através de todos os valores lançados.

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
fonte
1
Erro estranho: Aviso: argumento inválido fornecido para foreach () em /home1/mountgam/public_html/zombiewrath/reports.php na linha 30 = /
James Andrew
2
Isso só funcionaria se você usar a []sintaxe na definição de campo, o que faz o PHP criar esse valor $ _POST como uma matriz. Caso contrário, será um único valor sem matriz, causando a explosão do loop foreach ().
Marc B
1
Eu tentei tanto, mas ok eu vou tentar novamente (Sem [] em forma / nome)
James Andrew
16

você deve nomear suas caixas de seleção de acordo:

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

você pode acessar todas as caixas de seleção marcadas com

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

ps. escape da saída corretamente ( htmlspecialchars())

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

E após a postagem, você pode percorrê-las:

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

Ou obtenha um determinado valor publicado na página anterior:

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

Desculpe, tópico antigo, mas esta é uma peça importante a ser mencionada, com a qual o @JamesRattray e outros estavam tendo problemas.

NÃO feche inputautomaticamente a tag (usando />) quando estiver tentando postar vários valores no script PHP. Quando você fecha a tag automaticamente, ela termina a definição da matriz e você terá apenas um único valor postado no seu script no envio. Com efeito, a resposta da @Scone pode não funcionar até que ela />seja alterada.

É isso que causa o Warning: Invalid argument supplied for foreach() in /home1/...erro do PHP neste caso.

EDIT: Como observado nos comentários abaixo, pesquisas adicionais sugerem que isso depende do DOCTYPE. Se você tiver o DOCTYPE definido para XHTML, será necessário que a tag de entrada seja fechada. Se você tiver um conjunto DOCTYPE de HTML5, será necessário que a tag de entrada não seja fechada. Também há uma chance de que isso possa ser determinado pelo navegador em que o usuário está visualizando a página e quão bem ela segue o DOCTYPE especificado no código.

Jon Gallup
fonte
Incorreta. A tag de entrada com fechamento automático não afetará os valores que passam para o PHP.
Raptor
@ Raptor Em mais pesquisas, sim, pode afetar E, como você diz, não, não. mas em pesquisas adicionais, isso só será afetado se o DOCTYPE estiver definido. O HTML5 não reconhece a tag como fechada (e seria inválida se estiver fechada), enquanto o XHTML exige que a tag seja fechada. Veja a página de informações do W3Schools aqui: link
Jon Gallup
@Raptor Embora o W3Schools possa estar cheio de erros, é importante observar que as informações que ele (e outros sites) podem fornecer são convincentes para a pergunta. Estou apenas afirmando que, no processo de solução de problemas, QUALQUER informação para tentar corrigir um problema é melhor que NENHUMA informação. Nesse caso, se você desejar outra referência, o W3 especifica que o tag de entrada não deve ser fechado de forma alguma, pois não será compatível. Editarei minha resposta original para refletir o DOCTYPE.
Jon Gallup
5

É bem simples. Preste atenção e você receberá imediatamente! :)

Você criará uma matriz html, que será enviada para a matriz php. Seu código html ficará assim:

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

Onde [1] [2] [3]são os IDs de suas mensagens, o que significa que você vai echoo seu $row['Report ID']em seu lugar.

Então, quando você enviar o formulário, sua matriz PHP ficará assim:

print_r($check_list)

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

Dependendo de quais foram verificadas e quais não foram.

Tenho certeza que você pode continuar deste ponto em diante.

Richard Rodriguez
fonte
6
Lembre-se de que check_list[]começaria com check_list[0]e não check_list[1].
Arbiter
1
value = "marcado" é contraproducente. Se nenhum valor for especificado, você ativará. A vantagem de especificar os valores que você deseja enviar nos atributos de valor é que você pode enviar dados quase arbitrários que não precisam se tornar um índice de matriz PHP. A iteração sobre valores de matriz com foreach também é mais fácil do que a iteração sobre as chaves.
Rudiger W.
0

No meu caso, o que é necessário para vingar em um único valor, por tanto quanto eu não tiver uma 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);

Conhece-me aseguro que os valores sean 1 e separados por coma. Como no MySQL, você pode consultar, vingar na matriz ou não:

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