Recolher dados de um Select Multiple com PHP

Este script ensina-nos a técnica necessária para aceder aos elementos seleccionados num select multiple.

Por José Lorenzo Escudero


Publicado em: 26/9/04
Valorize este artigo:
Talvez um problema que podemos ter algum dia ao trabalhar com PHP, é querer obter os dados de um select multiple. Relembramos que um select multiple é um campo de formulário onde se podem seleccionar vários elementos ao mesmo tempo.

Nota: Para seleccionar vários elementos de um campo select multiple, temos de utilizar o botão de "control" e fazer click sobre cada um dos elementos que desejamos seleccionar. É mito importante que este ponto fique claro para os usuários das vossas páginas, pois as vezes não sabem como faze-lo.

Para compreender melhor o que desejamos fazer, é muito interessante ver a página que contem o exemplo. Vejamos o código do exemplo...

<form action="trataformulario.php" method="POST">
Nome: <input type="text" name="nome"><br>
Apelidos: <input type="text" name="apelidos"><br>
Email: <input type="text" name="email"> <br>
Cerveja: <br>
<select multiple name="cerveja">
<option value="Super Bock">Super Bock</option>
<option value="Sagres">Sagres</option>
<option value="Heineken">Heineken</option>
<option value="Carlsberg">Carlsberg</option>
<option value="Antartica">Antartica</option>
...
</select><br>
<input type="submit" value="Enviar dados!" >
</form>


Temos este formulário na nossa página e queremos recolher os dados introduzidos pelo usuário. Para os campos "nome", "apelidos" e "email" não temos nenhum problema, fazemo-lo através do método habitual, isto é:

<?php
echo "Nome: ". $_POST["nome"];
echo "<br>Apelidos: ". $_POST["apelidos"];
echo "<br>E-mail: ". $_POST ["email"];
?>


A questão é, e porque não pôr "$cerveja=$_POST["cerveja"]"? O problema está em que os option do select multiple têm todos o mesmo nome e no caso de ter vários elementos seleccionados só obteríamos o último elemento. E como podemos então resolver isto? A solução ao nosso problema é bem simples. Basta com pôr no final do nome do campo select multiple uns "[]", por exemplo no nosso caso sería alg9o assim como "cerveja[]".Deste modo PHP interpreta o campo em questão como um array com tantas posições como elementos tenham sido seleccionados no select multiple. Vejamos como ficaria o nosso exemplo:

<form action="trataformulario.php" method="POST">
Nome: <input type="text" name="nome"><br>
Apelidos: <input type="text" name="apelidos"><br>
Email: <input type="text" name="email"> <br>
Cerveja: <br>
<select multiple name="cerveja[]">
<option value="Super Bock">Supre Bock</option>
<option value="Sagres">Sagres</option>
<option value="Heineken">Heineken</option>
<option value="Carlsberg">Carlsberg</option>
<option value="Antartica">Antartica</option>
...
</select><br>
<input type="submit" value="Enviar dados!" >
</form>


E para recolhes a informação actuariamos da seguinte maneira...

<?php
echo "Nome: ". $_POST["nome"];
echo "<br>Apelidos: ". $_POST["apelidos"];
echo "<br>E-mail: ". $_POST ["email"];
$cervejas=$_POST["cerveja"];

//recorremos o array de cervejas seleccionadas. Não esquecer que a primeira posição de um array é a 0
for ($i=0;$i<count($cervejas);$i++)
{
   echo "<br> Cerveja " . $i . ": " . $cervejas[$i];
}
?>


Nota: Ao pôr este tipo de nomes (acabados em "[]") a um campo de um formulário e se usamos funções JavaScript para validálos, utilizálos, etc... devemos acrescentar a esse campo, para além do nome, o atributo HTML "id" e utilizar este último atributo como identificador do campo, em vez do nome que se tenha colocado no atributo "name" como se costuma fazer. Em caso contrario teríamos problemas com JavaScript...

O código completo deste exemplo poderia ser o seguinte. Reparem que colocamos todo o código num ficheiro PHP. Este código tem um formulário reentrante, isto é, a página chama-se a si mesma para processar o formulário.

<?
if (!$_POST){
?>
<form action="select_multiple.php" method="POST">
   Nome: <input type="text" name="nome"><br>
   Apelidos: <input type="text" name="apelidos"><br>
   Email: <input type="text" name="email"> <br>
   Cerveja: <br>
   <select multiple name="cerveja[]">
      <option value="Super Bock">Super Bock</option>
      <option value="Sagres">Sagres</option>
      <option value="Heineken">Heineken</option>
      <option value="Carlsberg">Carlsberg</option>
      <option value="Antartica">Antartica</option>
   </select><br>
   <input type="submit" value="Enviar dados!" >
</form>
<?
}else{
   echo "Nome: ". $_POST["nome"];
   echo "<br>Apelidos: ". $_POST["apelidos"];
   echo "<br>E-mail: ". $_POST ["email"];
   $cervejas=$_POST["cerveja"];

//recorremos o array de cervejas seleccionadas. Não esquecer que a primeira posição de um array é a 0

   for ($i=0;$i<count($cervejas);$i++)
   {
    echo "<br> Cerveja " . $i . ": " . $cervejas[$i];
   }
}
?>


Executar Exemplo





Comentários do artigo
Foram enviados 16 comentários ao artigo
10 comentários não revisados
6 comentários revisados:
Por: Minhap
04/10/06
Ok, tudo certo
mais agora me diga, eu preciso guardar essas informações num banco de dados e posteriormente consult=a-las,
como faço isso?
Uso PHP Myadim.
Por: Elizenias
08/3/07
Pô, muito legal esse artigo. Se todos fossem assim. De um jeito simples, faz a gente desenrolar na hora do aperreio. Parabéns!!
Por: Jorge Luiz F
14/3/07
Nossa, vcs me ajudaram muito, quebrou o maior galho este artigo de select multiple.
Parabéns pelo site!!!!!
Por: Luiz Cabral
17/8/07
caramba...kkk..sem esse tutorial eu ia demorar pra descubrir como usar o selec multiplo..muito bom.
Por: Joaqui
29/4/08
um simples [] faz tanta diferença!
Por: César Rodriguez
20/8/08
Pessoal, o método do form tem de estar escrito em maiúsculas: POST, e não post. Se não for assim, a sua variável $_POST vai continuar pegando apenas o último item do SELECT, em vez da array toda.

Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato