Preenchendo um select com dados de outro select

Existem duas maneiras de preencher um select com dados de outro select. Através de código jQuery e PHP, ou somente com o PHP.

Mas qual a diferença entre eles?

Utilizando jQuery e PHP:

Com código jquery ou javascript, os selects transferem dados de um para outro sem atualizar a página e sem submeter o formulário. Quando selecionamos o valor do select 1, o jQuery chama um script PHP que preenche o select 2.

Somente com o PHP:

Utilizar apenas o PHP é bem mais simples, pois ao submeter o formulário, passamos nossas variáveis pela querystring(url) utilizando o método GET.

Neste exemplo vou utilizar apenas o PHP para ilustração, mas em breve postarei outro artigo dentro da categoria jQuery exemplificando o uso com jQuery e PHP.

Para este exemplo utilizarei apenas duas tabelas: ESTADOS e CIDADES.

Preenchendo um select com dados de outro select

Após criadas as tabelas no banco de dados MySQL, podemos prosseguir com o script em PHP, onde inicialmente o script fará o seguinte:

1 – Será feita uma busca por estados;
2 – Preencherá nosso primeiro select com valores dos estados vindos do MySQL.

Terminada a primeira etapa, a segunda etapa dependerá de uma ação do usuário. O usuário irá submeter o formulário com o estado escolhido.
Após a ação do usuário, nosso script prossegue:

1 – O script verifica se realmente foi passado o ID do estado pela url, se não, não faz nada;
2 – Se sim, buscamos as cidades correspondentes ao ID do estado escolhido;
3 – Apresenta apenas as cidades do estado escolhido.

Caso queira utilizar o método POST, é necessário mudar o method do formulário e também o $_GET por $_POST dentro do script.

Logo abaixo temos o script implementado.

#estabelecemos conexão com o banco de dados
mysql_connect('localhost','root','') or die(mysql_error());
#seleciona o banco de dados
mysql_select_db('exemplo') or die(mysql_error());

$estados = mysql_query("SELECT id,titulo FROM estados ORDER BY titulo");

$html .= '<form name="produto" method="get" action="">';
$html .= '<p>';
$html .= '<label for="">Selecione um estado</label>';
$html .= '<select name="id_estado">';
$html .= '<option>Selecione...</option>';

while($estado = mysql_fetch_array($estados)) {
$selected = ($_GET['id_estado'] == $estado['id']) ? 'selected="selected"' : null;
$html .= '<option '.$selected.' value="'.$estado['id'].'">'.$estado['titulo'].'</option>';
}

$html .= '</select>';
$html .= '</p>';

if(isset($_GET['id_estado'])) {
$html .= '<p>';
$html .= '<label for="">Selecione uma cidade</label>';
$html .= '<select name="id_cidade">';
$cidades = mysql_query("SELECT id,titulo FROM cidades WHERE estado_id = ".$_GET['id_estado']." ORDER BY titulo");

while($cidade = mysql_fetch_array($cidades)) {
$html .= '<option value="'.$cidade['id'].'">'.$cidade['titulo'].'</option>';
}
$html .= '</select>';
$html .= '</p>';
}

$html .= '<input type="submit" value="Enviar" />';
$html .= '</form>';
echo $html;

Se fossemos utilizar três selects (com municípios, por exemplo), o processo seria o mesmo. Após enviarmos o estado, filtramos as cidades; depois enviamos o estado e a cidade escolhida e filtramos os municípios.

Comentários

Eduardo | 30/01/2017 11:03:18

Não funciona !!!
Quando chega do teste "if($_GET['id_estado'])" dá erro:
"( ! ) Notice: Undefined index: id_estado"
Obrigado...

Gabriel Henrique | 12/07/2016 20:21:56

Oi! Tenho um programa que escreve em uma única tabela, os dados que preciso, sendo eles: Estados; Cidades e Ruas. No programa x.html, tenho um formulário que tem um dropdown menu pré preenchido com o nome dos estados, gostaria de saber, sem utilizar duas tabelas, apenas, uma como preencher o dorpdown, inicialmente vazio, das cidades, quando o aluno escolher um estado. Desculpe! Mas ficou meio confusa o seu código. Agradeço sua atenção!

Josean Matias:

Olá Gabriel,

O exemplo no post seria mais para quem precisa de conhecimento básico sobre essas buscas no banco, quando já tem algo pronto e de forma diferente, realmente as informações no post não serão satisfatórias, por ser um "passo a passo".

O ideal para um projeto de banco de dados é trabalhar com duas tabelas para o uso de estados e cidades, no seu caso não teria como saber qual foi a ligação feita entre estados e cidades e estabelecer uma busca. Será necessário analisar a tabela e identificar por qual campo poderá filtrar as cidades de determinado estado.

lucas costa | 03/07/2016 20:20:36

ola queria saber como faço para fazer um selct preencher o outro
exemplo: vou preencher o nome do meu cliente e quando preencher esse campo com select o select abaixo do carro do cliente vai ser preenchido automaticamente. eu uso banco de dados do postgre como ficaria ?

Josean Matias:

Olá Lucas,

A programação será muito semelhante ao conteúdo deste post, a diferença que ao invés de atualizar a página para pegar o estado selecionado e buscar as cidades, dessa outra forma que deseja as cidades serão buscadas através de AJAX.

Raphael | 15/04/2016 16:28:19

Ola, gostaria de uma ajuda se possivel. Quero adicionar uma foto a uma tabela ja criada. Estou tentando salvar a foto em uma tabela a parte e depois junta la com uma chave estrangeira.
EX: usuario(...);
usuarioFoto(...id_usuario);
Quero fazer um select que apareça o nome dos usuarios( ja ta feito) e ao lado selecionar a foto e salvar.
Podem me ajudar?

leonardo | 08/11/2013 10:33:18
bom dia
eu tenho um select para marca de carros e dependendo da escolha ele tem que mostrar no outro os modelos da quela marca mas eu tenho mais campos no from e tb tem uma table no from funciona tb?
Josean Matias:

Olá Leonardo, no select será necessário apenas o identificador da marca e o título dela, a mesma coisa para o modelo. Os campos adicionais que citou do from não serão utilizados para o select. Trazendo do banco o identificador e o título possivelmente funcionará, desde que faça a relação correta das chaves entre as tabelas. Abraços!

Regiane | 26/09/2013 10:22:22
Bom dia,
Eu tenho uma duvida, caso eu tenha um campo que ao selecionar a opção dele me abra outros dois combobox para ser selecionado a opção. No meu banco tem duas tabelas com relacionamento entre elas. Porem o que esta acontecendo é que no banco so esta salvando uma das opções a outra não. Poderia me ajudar?????
Josean Matias:

Olá Regiane, verifica com "var_dump" ou "print_r" se todos os dados estão chegando no local de inserção, se sim, então provavelmente o problema está na SQL. Caso contrário talvez seja o nome dos cmpos no formulário. Abraços!

Joao carlos | 28/04/2011 10:02:22
Bom dia, seria possivel me enviar um exemplo funcional do select com dados de outro select? Um abraço
raquel | 12/01/2011 14:09:31
não gostei

Comentar