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.
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
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.
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.
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!
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!
Comentar