Boteco Digital

Carregando um ComboBox com AJAX com JQuery

23/10/2009
Rodrigo Aramburu

Como vimos em um artigo anterior sobre AJAX é muito fácil utilizar técnicas de AJAX para tornar um site dinâmico. Hoje veremos um exemplo fácil de como selecionar um estado em um ComboBox e carregar as cidades em outro.

Para começarmos termos que ter os estados e as cidades armazenadas no banco de dados que podem ser obtidas a partir do site. Para ficar mais claro colocarei as DDL abaixo.

CREATE TABLE tb_estados(
  id int(2) unsigned zerofill NOT NULL auto_increment,
  uf varchar(10) NOT NULL default '',
  nome varchar(20) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

CREATE TABLE tb_cidades (
  id int(4) unsigned zerofill NOT NULL auto_increment,
  estado int(2) unsigned zerofill NOT NULL default '00',
  uf varchar(4) NOT NULL default '',
  nome varchar(50) NOT NULL default '',
  UNIQUE KEY id (id),
  KEY id_2 (`id`)
);

Agora que já temos as tabelas em nosso banco MySQL criamos uma página com os dois ComboBox com o dos estados já preenchido, para isto realizamos uma consulta ao banco de dados MySQL para preenche-lo.

<select name="estados" id="estados">
    <?php
        mysql_connect('localhost','root','********');
        mysql_selectdb('combobox');

       $result = mysql_query("select * from tb_estados");

       while($row = mysql_fetch_array($result) ){
            echo "<option value='".$row['id']."'>".$row['nome']."</option>";

       }

    ?>
</select>

<select name="cidades" id="cidades">
    <option value="0">Escolha um estado</option>
</select>

Na linha 3 conectamos no banco através da função mysql_connect() passando o host que esta o banco de dados, o usuário e a senha de acesso ao banco. NA linha 4 selecionamos o banco de dados que queremos utilizar com a função mysql_selectdb().

Na linha 6 utilizamos a função mysql_query() para realizar uma consulta ao banco de dados para trazer todos os estados.

Na linha 8 utilizamos a função mysql_fetch_array() para acessar uma linha da nossa consulta e armazená-la na variável $row. A função mysql_fetch_array() retorna a linha da consulta em formato de array, sendo que cada índice do array é o nome da coluna em que o valor está.

Na linha 9 montamos as opções do nosso select.

Bom agora com nossa página pronta podemos inserir o código javascript(AJAX) para executar a consulta quando selecionarmos o estado. O código utiliza a biblioteca JQuery então não esqueça de carregá-la antes de inserir o código.

        $(document).ready(function(){
            $('#estados').change(function(){
                $('#cidades').load('cidades.php?estado='+$('#estados').val() );
            });
        });

Na linha 2 selecionamos o elemento com o id estados(o primeiro select), e adicionamos o evento onChange que é acionado quando ele muda de valor. Quando este evento for acionado(linha 3) ele vai selecionar o select com o id cidades fazer uma consulta AJAX a página cidade.php passando por parâmetro GET o id do estado que foi selecionado no select de estados. O retorno desta consulta será inserido dentro do select prenechendo as opções de cidades.

Bom agora que já temos um código javascript que faz uma requisição a uma página devemos criar esta página ;)

Lembrando que o retorno desta página vai preencher nosso select, então ela deve retornar tags option certo!

<?php
$idestado = $_GET['estado'];
mysql_connect('localhost','root','******');
mysql_selectdb('combobox');
$result = mysql_query("SELECT * FROM tb_cidades WHERE estado = ".$idestado);
while($row = mysql_fetch_array($result) ){
    echo "<option value='".$row['id']."'>".$row['nome']."</option>";
}
?>

O código é bem parecido com o anterior onde preenchemos o select estados, só que desta fez utilizaremos uma consulta com um cláusula WHERE onde selecionamos somente as cidade que tiverem o estado igual ao que foi passado por parâmetro GET e que recebemos na linha 2.

O download do exemplo pode ser feito aqui

Bom este exemplo é bem simples, é possível fazer muito mais coisas com JQuery e AJAX basta ter criatividade.

Até a próxima!


, , ,

Atualmente existe 23 comentários

  1. marcelo 19/11/2009:

    Olá rodrigo,
    gostaria de saber qual é o formato que o banco te retorna quando tu faz a requisição.
    Ex.: o que é retornado no result da linha “while($row = mysql_fetch_array($result) ){” ?
    Obrigado.

  2. Rodrigo Aramburu 19/11/2009:

    ao utilizar a função mysql_fetch_array() é retornado a próxima linha da tabela de resultado em um array, sendo cada índice do array o nome da coluna.

    Este link deve ajudar http://php.net/manual/pt_BR/function.mysql-fetch-array.php

  3. Vitor Odenor Aquino da Silva 25/11/2009:

    Fiz um sisteminha que continha os campos pais, cidade e estado no cadastro de clientes, o que acontece é que na atualização não consigo que os campos venham preenchidos automaticamente por causa do ajax… você pode me ajudar a resolver isso?

  4. Juliano 12/01/2010:

    muito bom. esses tutorial. mas estou com um problemas 2 estados não estão funcionando “São Paulo” e “Alagoas”, não consigo encontrar o problema.

  5. Rodrigo Aramburu 13/01/2010:

    O exemplo esta funcionando corretamente, você pode utilizar o plugin firebug para ver se ocorre algum erro de javascript.

    Também pode ser algum problema com o banco de dados tente listar as cidades de alagoas na mão “http://localhost/ajax-combo/cidades.php?estado=02″

  6. Rafael 21/03/2010:

    Parabéns! Simples e direto, me ajudou muito!

  7. David 28/09/2010:

    VALEU CARA MUITO BOM! ESTAVA PRECISANDO DISSO A TEMPO.

  8. Ricardo 19/01/2011:

    Olá Rodrigo,

    Muito bom o seu combo!! Deu certinho aqui!!! Estou tentando fazer ele atualizar um terceiro combobox com o resultado do segundo (tipo: Seleciona diretoria -> Gerente -> subordinado), mas não está dando certo….já tentei de tudo e ele não consegue resgatar o valor do segundo pra fazer a query. Voce consegue popular um 3° menu com o resultado do segundo???
    Obrigadão!!!

  9. Davi 17/02/2011:

    Muito bom !!!! Funciona perfeitamente…. parabéns pelo trabalho. É dedo pra cima !!!!

  10. RAFAEL 16/03/2011:

    NÃO FUNCIONA!

  11. RAFAEL 16/03/2011:

    FIZ O DOWNLOAD DOS ARQUIVOS, MUDEI A CONFIG DO BANCO, CRIEI AS TABELAS , E NADA!

    EM XAMPP PELO MENOS NÃO RODOU!

  12. rodrigo 14/04/2011:

    Bom dia. Elaborei um combo box em meu site, mas sempre que eu testo no IE ele trava o IE.
    Funciona perfeito no chrome e no ff.

    Achei na net e refiz usando o seu exemplo para ver se o problema estava no meu código, mas mesmo com o seu exemplo o IE fica dando mensagem de Stop Running this Script?

    Já teve este problema?
    Obrigado,

    Rodrigo

  13. Igor Cemim 18/05/2011:

    Valeu! Um belo artigo, muito esclarecedor.

    Abraço

  14. Raul 14/09/2011:

    Muito bom. Muito Simples.
    Obrigado por compartilhar.

    Minha única sugestão seria acrescentar encodeURIComponent. Sei que no caso de estados não faz diferença, mas vai ajudar quem usaa com outros valores…

    $(‘#cidades’).load(‘cidades.php?estado=’+encodeURIComponent($(‘#estados’).val()) );

  15. Jorge Umberto 20/09/2011:

    Deu tudo certo. Funcionou perfeitamente. Agora, vou implementar no Joomla!

  16. Miguel Machado 07/11/2011:

    Parabéns por este artigo, funcionou perfeitamente e consegui criar um 3º nível sem problemas.

  17. Julio 15/11/2011:

    Cara, muito show! muito grato!!!

    abs.

  18. Marjori 30/11/2011:

    Parabéns pelo script, já tinha visto isso em um monte de sites, mas o seu foi o mais simples e o único que funcionou.
    Brigadão

  19. Eliseu 09/12/2011:

    Prezados, é importante sempre verificar com código se o javascript do cliente está ativo, também é importante concatenar as strings.

  20. Edinei Enrique 31/12/2011:

    Muito bom parabens !!!

    Quero agradecer desde já por disponibilizar o Download!!!

    È assim que se faz um BELO Post!!!

    Qualquer Duvida Posto aqui BLZ!!!

  21. Edinei Enrique 31/12/2011:

    Cara Acabei de Testar e FUNCIONOU MUITO BEM!!

    Amem!!!

    Estava com um Problemão aqui por causa do Ajax que estava em conflito com meus combos

    Testei este codigo no FF – IE8 – e no Crome tudo OK!

    Rodrigo Aramburu
    Cara faça mais Post acertou de Cheio!!!
    Se tiver mais alguns e quiser me enviar tbem o email é neisjb (Hotmail)!!

  22. Raphael 09/01/2012:

    Cara valeu mesmo, funcionou muito bonito!!!!

  23. johnatan 16/01/2012:

    Valeu mesmo, estava precisando de algo assim….

Deixe um comentário