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
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
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.
Pô, muito legal esse artigo. Se todos fossem assim. De um jeito simples, faz a gente desenrolar na hora do aperreio. Parabéns!!
Nossa, vcs me ajudaram muito, quebrou o maior galho este artigo de select multiple.
Parabéns pelo site!!!!!
caramba...kkk..sem esse tutorial eu ia demorar pra descubrir como usar o selec multiplo..muito bom.
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.