Populando selects de cidades e estados com AJAX (PHP e jQuery)
Nada pior do que deixar um campo de cidade como texto livre para os usuários. Os erros de português e digitação acabam com qualquer chance de um relatório fiel filtrado por localidade. Além do mais, é muito mais fácil pro próprio usuário poder escolher sua cidade em uma lista já estabelecida.
Com este artigo, pretendo mostrar um método fácil de implementar um select de estados que, via AJAX, popula o select de cidades. O frontend utiliza a biblioteca javascript jQuery e o script AJAX foi desenvolvido em PHP.
Abaixo, além do arquivo de exemplo, você também encontra para download um SQL completo com as tabelas de cidades e estados. Portanto, caso queira desenvolver para um outra linguagem, basta seguir a lógica apresentada aqui.
Banco de Dados
Antes de mais nada, precisamos criar a nossa base de cidades e estados. No seu banco MySQL, crie as tabelas cidades e estados. O arquivo SQL abaixo faz isso e ainda insere todos os registros necessários. Não sei se essa base está atualizada e/ou completa, mas é a que sempre utilizo em meus projetos e, até agora, ninguém reclamou!
O select de estados vai utilizar os campos cod_estados e sigla como dados. Já o de cidades, listará as cidades de acordo com o campo estados_cod_estados, exibindo o nome e tendo como valor cod_cidades.
O frontend
A idéia básica é a seguinte: o select de estados virá automaticamente populado com os registros cadastrados em nosso banco de dados. Toda vez que o usuário selecionar um estado diferente, o select de cidades será preenchido via AJAX fazendo uma consulta na nossa tabela de cidades, trazendo todos os registros relacionados ao estado.
Note que não vou me estender muito na conexão com o banco de dados. O ideal é fazer isso separado, com variáveis para o host, senha, usuário etc. Aqui vai tudo no mesmo arquivo, só pra agilizar o exemplo.
<?php
$con = mysql_connect( 'localhost', 'root', 'root' );
mysql_select_db( 'cadastro', $con );
?>
<label for="cod_estados">Estado:</label>
<select name="cod_estados" id="cod_estados">
<option value=""></option>
<?php
$sql = "SELECT cod_estados, sigla
FROM estados
ORDER BY sigla";
$res = mysql_query( $sql );
while ( $row = mysql_fetch_assoc( $res ) ) {
echo '<option value="'.$row['cod_estados'].'">'.$row['sigla'].'</option>';
}
?>
</option></select>
<label for="cod_cidades">Cidade:</label>
<select name="cod_cidades" id="cod_cidades">
<option value="">-- Escolha um estado --</option>
</select>
O código acima representa o estado inicial da listagem de estados/cidades.
Populando o select
Vejamos agora como fica o javascript (jQuery) responsável pelo carregamento de dados no select de cidades. Vamos utilizar o padrão JSON para a saída do script PHP. Se você ainda não conhece esse padrão, vale a pena dar uma pesquisada - ele é extremamente útil para scripts AJAX, evitando aquele blocão HTML que todo mundo costuma usar como saída. O PHP fica responsável somente pelos dados enquanto o javascript trata e monta o HTML.
$(function(){
$('#cod_estados').change(function(){
if( $(this).val() ) {
$('#cod_cidades').hide();
$('.carregando').show();
$.getJSON('cidades.ajax.php?search=',{cod_estados: $(this).val(), ajax: 'true'}, function(j){
var options = '<option value=""></option>';
for (var i = 0; i < j.length; i++) {
options += '<option value="' + j[i].cod_cidades + '">' + j[i].nome + '</option>';
}
$('#cod_cidades').html(options).show();
$('.carregando').hide();
});
} else {
$('#cod_cidades').html('<option value="">-- Escolha um estado --</option>');
}
});
});
O jQuery possui o método getJSON para o recebimento de dados no padrão citado acima. Como parâmetro enviamos o código do estado selecionado. O script PHP faz então uma pesquisa na tabela cidades e retorna os resultados relacionados com o código do estado em um array JSON.
Agora a última peça do nosso exemplo, o PHP responsável por retornar os dados encontrados, chamado na função getJSON:
header( 'Cache-Control: no-cache' );
header( 'Content-type: application/xml; charset="utf-8"', true );
$con = mysql_connect( 'localhost', 'root', 'root' ) ;
mysql_select_db( 'cadastro', $con );
$cod_estados = mysql_real_escape_string( $_GET['cod_estados'] );
$cidades = array();
$sql = "SELECT cod_cidades, nome
FROM cidades
WHERE estados_cod_estados=$cod_estados
ORDER BY nome";
$res = mysql_query( $sql );
while ( $row = mysql_fetch_assoc( $res ) ) {
$cidades[] = array(
'cod_cidades' => $row['cod_cidades'],
'nome' => $row['nome'],
);
}
echo( json_encode( $cidades ) );
Como de praxe, deixo pra vocês o trabalho de efetuar melhorias em nosso script. E se, em um mesmo formulário, precisarmos de dois campos de endereço (um residencial e outro comercial)? Repetir o código nem pensar! O ideal seria uma função recebendo como parâmetro os IDs dos selects de estado e cidade. E que tal uma base de dados para bairros? Toda vez que uma cidade fosse escolhida, um select de bairros seria automaticamente populado. Ideias não faltam.
Espero que este post sirva de base para vocês melhorarem seus formulários de cadastro. E qualquer dúvida já sabem, utilizem os comentários.
116 comentários.
Ricardo Kruger escreveu:
Excelente este código, ajudou em muito a funcionalidade de meu sistema de cadastro o qual estou desenvolvendo. Assim que tiver um melhora no meu código, irei postar aqui uma atualização, como por exemplo o de bairros. Abraços
responder
adriano escreveu:
vocÊ tem esse código pra enviar não tô conseguindo rodar
responder
Alexandre Broggio escreveu:
Vlw pelo post ^_^
responder
Ricarte A. Barros escreveu:
Bem enxuto! nota 10!
responder
Felipe escreveu:
Cara bom de mais esse seu script, ele funciona 100% na minha maquina local , mas quando faço o FTP ele não lista as cidades, a conexão com o banco esta correta, sei lá pq não está funcionando.. vc tem alguma dica pra mim sobre oq pode estar acontecendo.??? se quiser ver é só acessar www.familyturismo.com valew abraços
responder
Davi Ferreira escreveu:
Fala aí, Felipe. Cara, dei uma olhada lá no código-fonte do seu site e não consegui achar nenhuma referência ao javascript que carrega as cidades ou até mesmo do jquery. Não é aquele na home? Tá subindo certinho? Abrá!
responder
Rene Felix escreveu:
Oi amigo td bem,,,,,poxa sou iniciante copiei seu codigo, tem estados onde as cidades retornam null, vc tem ideia do que possa tá acontecendo?
responder
Renato escreveu:
e aee
o meu aconteceu a mesma coisa
o problema que eu percebi é que apenas as cidades que possuem acento ou ~ que não leem
porém nao sei resolver também
caso eu descubra volto a postar aqui.
modifiquei para utf8 e nao deu
modifiquei para europeu ocidental e deu na mesma
vou continuar tentando aqui e qualquer coisa eu volto a postar
caso o criador do topico saiba responder eu agradeço!! =DD
responder
Gabriel Lau escreveu:
Geralmente isso é problema de codificação mesmo. Verifique se o arquivo do seu código está formatado para UTF8(SEM BOOM). E se ainda não estiver funcionando, no campo da cidade, você coloca
utf8_encode($nome_da_cidade)ouutf8_decode($nome_da_cidade).responder
Luiz Bezerra escreveu:
O meu na hr que eu subo tbm nao lista as cidades.
responder
Luiz Bezerra escreveu:
obs: Versão do PHP 5.2.12 Versão do MySQL 5.0.85-community
responder
tiago escreveu:
como se faz esses campos de códigos, com a numeração das linhas ao lado? valeu
responder
tiago escreveu:
Ah, esqueci de especificar melhor: "como se faz esses campos de códigos, com a numeração das linhas ao lado?", esses do seu blog, onde você mostra os códigos. Gostaria de fazer um blog também e colocar isso... Obrigado.
responder
tiago escreveu:
outra coisa, na hora de carregar as cidades no mysql, algumas entraram com erros, como "BRASILÉIA", "TARAUACÃ", "JORDÃO", etc... sabe como faço pra nao entrar com esses caracteres?? Valeu
responder
Bruno escreveu:
Aqui eu utilizei o script para carregar um combobox com subcategoria de produtos, ta dando problema em nomes com acento, por exemplo Câmera Digital, só aparece a letra C se eu retirar o acento aparece toda a palavra como faço para aparecer com acento?
responder
Davi Ferreira escreveu:
Tem que se ligar que a base de dados está como UTF-8. Então se seu banco/sistema for ISO-8859-1 tem que converter a base de alguma forma.
responder
João Paulo escreveu:
responder
João Paulo escreveu:
echo htmlentities($menu_sub['nome'], ENT_COMPAT, 'UTF-8')
responder
tiago escreveu:
Estou utilizando outro sistema, só com javascript e mais nada. Quem quiser me pedir, é só adicionar no MSN tbrazil@hotmail.com
responder
Perroni escreveu:
Mais um... Obrigado graças as pessoas como você que os sobrinhos evoluem.
responder
Roberto cezar escreveu:
Cara valeu show de bola o escript valeu mesmo um abraço
responder
Rafael Gilead escreveu:
Meu velho, conseguí por para funcionar perfeitamente. O problema que estou encontrando é para por a cidade para ser selecionada em uma página para EDITAR o cadastro. Pois eu coloco o estado SELECTED mas as cidades só aparecem se eu mecher no select dos estados.
responder
Ayesha escreveu:
Olá, inclui o cod no site q estou desenvolvendo e nao carrega as cidade de maneira alguma... aqui esta o php em questao: http://www.canalcomercio.tv/tecnica/teste/cadastro/cadpj.php alguma ideia?
responder
Davi Ferreira escreveu:
Seu servidor não tem suporte nativo a JSON. Utilize esta classe: http://mike.teczno.com/json.html.
responder
Plínio escreveu:
Só não entendi o pq do campo id do estado ser um int(11) se temos somente 27 estados.
responder
Ulisses Costa escreveu:
Amigo, desculpe a B.O, estou com a mesma dificulde em carregar as cidades no servidor remoto, já baixei a biblioteca sujerida mais nada, abaixo segue o o codigo. require("JSON.php"); //importando a biblioteca $json = new Services_JSON();//criando o objeto para manipular a JSON ... $output = $json->encode($cidades); echo($output);
responder
Marco Tulio escreveu:
Boa tarde! Primeiramente muito obrigado pelo post. Estou a procurar por vários dias mas não encontrei nada que fizesse o que eu queria. Estou a ter o seguinte problema: Para inserir um combobox dá certo. Funciona ok! Porém quando coloco 2 combobox não está a funcionar. Não sei o que devo fazer. Você pode me dar alguma dica de como fazer isso? Obrigado!
responder
Davi Ferreira escreveu:
Fala Marco, você vai precisar desenvolver uma função ou duplicar (ugh!) o trecho de código modificando os IDs dos elementos (#cod_cidades, #cod_estados).
responder
Sidarta escreveu:
Olá Obrigado pelo código, mas estou com um problema, o primeiro e o último valor que da lista que é carregada estão como null. O que pode ser?
responder
Brunno Velasco escreveu:
Pra resolver o problema da acentuação: mysql_query("SET NAMES 'utf8'", $con); mysql_query('SET character_set_connection=utf8', $con); mysql_query('SET character_set_client=utf8', $con); mysql_query('SET character_set_results=utf8', $con);
responder
Junior Eberhardt escreveu:
No meu aqui apareceu certinho, quando seleciono algum estado, algumas cidades aparecem listadas como null...?
responder
carolina toledo escreveu:
Olá Davi e Junior, ótimo script, mas prá mim tb exibe várias cidades como null. Tem alguma sugestão prá resolver isso Davi? Valeu. Abs.
responder
Young Sam escreveu:
Quando for importar o banco de dados(pelo phpmyadmin, se for o caso) ao inves de utilizar o set 'utf8' selecione 'latin1' e importe normalmente. Os casos que estao dando 'null' eh pq possuem caracteres especiais do portugues: til, acentos, etc
responder
Rene escreveu:
Oi Junior o meu tambem aparece null em alguns campos, vc consequiu resolver, como?
responder
Rodrigo Prata escreveu:
Usando mysql_set_charset('utf8', $con); resolve
responder
Seed escreveu:
No meu aparece em campos com acentuação , onde colocar esse código mysql_set_charset('utf8', $con); vlw
responder
Tom Santanna escreveu:
coloca bem abaixo de:
$con = mysql_connect( 'localhost', 'root', 'root' ) ;
mysql_select_db( 'cadastro', $con );
mysql_set_charset('utf8', $con);
Valeu Davi, excelente trabalho.
responder
Leonardo escreveu:
Uma dúvida! Se eventualmente o meu select cod_estado já estiver um valor selecionado logo de cara... sem que eu tenha que selecionar... como fazer com que a página já saiba disso e escolha as cidades... e/ou A cidade também??
responder
elen escreveu:
valeu, valeu, valeu mesmo, sempre tive medo de usar pq achava muito complicado, funciona!!! obrigada
responder
Fábio Henrique escreveu:
Primeiramente parabéns pelo post!! Fiz exatamente como descreveu e está funcionando perfeitamente porem estou encontrando dificuldades quando eu preciso por exemplo alterar um cadastro em que eu já tenho o id do estado e gostaria de chamar automaticamente sem precisar utilizar o change como funcionaria??? Preciso tipo repopular.. não sei se ficou claro..rs Preciso dessa sua ajuda.. Obrigado
responder
Davi Ferreira escreveu:
Fala, Fábio! Cara, isso você faz direto no PHP, quando você for editar um registro. É só verificar se ele tem um código pro estado cadastrado, aí faz uma consulta na tabela de cidades pra esse estado e imprime direto no carregamento da página, sem onchange. Valeu, Davi
responder
Fábio Henrique escreveu:
Obrigado.... já fiz isso ontem rs.... Show de bola... Parabéns... estou te seguindo no twitter também!!!
responder
Anderson escreveu:
Boa tarde, estou com um problema, estou usando a classe Sigma Grid para montar um grid personalizado. Esta funcionando blz, exceto pelo fato de nao mostrar os campos com acento tipo: WALMÁRIO, mostra so WALM. nao consigo arrumar isso, jah trabalhou com essa classe ou tem alguma dica?
responder
RIchard escreveu:
Bom dia, muito legal seu script, aqui funcionou certinho, porém eu uso uma página com um include e então desta forma o seu script não funciona, sabe de dizer se tem que colocar algum código na página que faz o include?:
responder
Clovis Rocha escreveu:
O sistema funcionou mas tem algumas cidadel que aparecem como null no campo da cidades, estou usando o banco de dados mysql, se puderem me ajudar a resolver este problema veja o erro neste endereço http://www.zonanortenaweb.com/arteweb/assinar_combodependente.php
responder
Alex escreveu:
Boa NOite Davi, eu fiz o download dos arquivos, e nao estao funcionando. Fico no aguardo por breve retorno, e isso que estou precisando realmente no meu sistema. abraços fortes alex
responder
Marcelolynx escreveu:
Show de bola!
responder
Juliana escreveu:
Oie...ótimo post! Mas poderia me ajudar numa coisa. Estou tendo dificuldade em ajustar para minha tabela No casa tu tem duas tabelas e eu apenas uma. Primeiro cadastro na tabela JOGO- data do jogo - hora - time1- time2 depois atualizo a tabela adicionando no campo gol_time1 e gol_time2 quero que no select..o usuário escolha(na hora de atualizar)a data que ocorreu o jogo e carregue no outro select os times que jogaram nesse dia. Mas não consigo fazer carregar... Acha que o problema é porque tenho apenas uma tabela??
responder
Ivan escreveu:
Olá! E sobre sites com Zend - MVC, coloquei o script e trás as cidades em branco, alguma ideia ?
responder
Márcio Vasconcelos escreveu:
Bom dia a todos. Estou com um problema e gostaria de pedir a ajuda de vocês. A partir de um combo de UF, preenchi com php e jquery um combo de cidades. Agora preciso submeter os dois códigos (uf e cidade) para uma outra página. Quando submeto, o código da uf vai tranquilo, mas o da cidade, que é o que foi preenchido com jquery, não vai nem com reza. Lembro que os dois combos estão no mesmo form e tal... Teoricamente não deveria dar problema, mas.... Espero que alguém consiga me dar um help. Abraço a todos.
responder
Miguel escreveu:
Esse problema do null eu resolvi removendo a acentuação de cada cidade. Foi a forma que achei deve ser algo em relação a incompatibilidade
responder
Willian Cima escreveu:
Davi, como faço pra usar (dois campos de cidae, e dois de estado) em cada página? Abs.
responder
João Victor escreveu:
Amigo, gostei muito do artigo, porem estou com um problema, não sei pq ele lista o seguinte erro: Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/nepenem/www/site/cidades.ajax.php on line 16 [] Mas ele ainda lista as cidades, mas varias cidades aparecem como null O que pode ser amigo? obrigado.
responder
Rafael Domingues escreveu:
Estou com esse mesmo problema enfrentado por esse nosso amigo. Márcio Vasconcelos escreveu: Bom dia a todos. Estou com um problema e gostaria de pedir a ajuda de vocês. A partir de um combo de UF, preenchi com php e jquery um combo de cidades. Agora preciso submeter os dois códigos (uf e cidade) para uma outra página. Quando submeto, o código da uf vai tranquilo, mas o da cidade, que é o que foi preenchido com jquery, não vai nem com reza. Lembro que os dois combos estão no mesmo form e tal... Teoricamente não deveria dar problema, mas.... Espero que alguém consiga me dar um help. Abraço a todos.
responder
Eric de Sá escreveu:
Olá estou começando a programar agora e gostei muito desse material que você publicou, teria como você passar os codigos fontes e o banco desse exemplo, pois ja tentei baixar pelo o link que você colocou mais fica como arquivo conrropido. Abraços.
responder
Douglas Pootz escreveu:
Queria saber como fazer para Estado, Cidades EEEEE Bairro..... $(function(){ $('#cod_estados').change(function(){ if( $(this).val() ) { $('#cod_cidades').hide(); $('.carregando').show(); $.getJSON('cidades.ajax.php?search=',{cod_estados: $(this).val(), ajax: 'true'}, function(j){ var options = ''; for (var i = 0; i
responder
Dieizon escreveu:
Tem cidades que aparecem NULL e o código do jquery tem um erro, falta um "+" em um trecho isso eu arrumei: $(function(){ $('#cod_estados').change(function(){ if( $(this).val() ) { $('#cod_cidades').hide(); $('.carregando').show(); $.getJSON('cidades.ajax.php?search=',{cod_estados: $(this).val(), ajax: 'true'}, function(j){ var options = ''; for (var i = 0; i
responder
Jackson escreveu:
Cara, muito bom o post, utilizei e adaptei para várias situações e funcionou direitinho mas apenas nos navegadores decentes, no IE não aparece as cidades, e que é mais curioso é que não consta nenhum erro de script. Ele recarrega o combo das cidades mas aperece uma lista de umas 8 opções em branco. Independente do estado que é escolhido a lista em branco aparece do mesmo tamanho. Ja quebrei a cabeça e revirei tudo mas não tenho idéia do que pode ser, poderia me dar uma luz???
responder
Rodrigo Prata escreveu:
Resolvi o problema com valores NULL mysql_set_charset('utf8', $con);
responder
Cleiton Garcia da Silva escreveu:
Funcionou perfeitamente, tive o problema do NULL. E dessa forma funcionou perfeitamente. Detalhe: Para quem usa um arquivo de conexão fora da página e usa include, tem que utilizar o: "mysql_set_charset('utf8', $con);" dentro da página do código e não na página de configurações globais, se não, vai funcionar o seu AJAX e não funcionará o resto das aplicações. Bem, pelo menos aqui foi isso, basta por isso ai na página do AJAX (cidades.ajax.php) e funcionará perfeitamente para quem teve o problema do 'NULL'. Abraço, e ótimo script Davi Ferreira. Muito bom mesmo, parece script gringo.
responder
Chiquito escreveu:
Cleiton! Execelente Resposta e solução....Salvou minha aplicação!
SHOW!!!!!!!!
responder
Cleiton Garcia da Silva escreveu:
Tentei implementar o código no meu sistema de venda de softwares. Separando os itens por categorias e subcategorias, funcionou perfeitamente, o único problema é que o javascript 'desrregula' todo o meu código, os accordions ficam tudo aberto, etc. O que posso fazer? Obrigado
responder
Cleiton Garcia da Silva escreveu:
Descobri o erro, foi no seguinte código: google.load('jquery', '1.3'); Removi ele, e funcionou. Eu já tinha o 1.4.2 do jQuery. E entrava em conflito com 1.3, não sei. kkk Abraço, agora está perfeito o código!
responder
Daniel Thales Naves escreveu:
Parabéns cara, me ajudou bastante. Na linha 9 do código JavaScript tem um erro de concatenação, está faltando um +. Abs!
responder
Edinei Ricardo escreveu:
Cara como vou fazer isso se vc não colocou os nomes dos arquivos???? "Fulanodetal.php "
responder
Mario Leandro escreveu:
gosteimuito. Me ajudou bastante!
responder
Fernando Sgrignoli de Oliveira escreveu:
Adaptei para outras partes do códigos categoria, subcategoria, marca, produtos.
Funcionou Legal nos Navegadores Firefox, Google Chome, mais no Internet Explorer não funciona, nem o exemplo seu que baixei, você sabe o que pode ser
responder
Fernando Sgrignoli escreveu:
Resolvi, Baixei a Classe jQuery 1.6.2 e não peguei do google, peguei local a classe jQuery, funcionou legal...
ao inves de usar
<script src="http://www.google.com/jsapi"></script> <script type="text/javascript">google.load('jquery', '1.3');</script>usei assim
<script type="text/javascript" src="../util/jquery-1.6.2.js"></script>Foi mal pelos códigos html asusahasu
responder
Bruno escreveu:
Muito bom o post!!
Eu gostaria de saber como eu faço para popular varios inputs ou outros dropdwon, selecionando um dropdown só, vou dar um exemplo.
Eu escolho em um dropdown um tipo de camiseta, e nos campos texto logo em baixo ele popula com os valores, Preço, validade essas coisas. E mudando no dropdown o tipo de camiseta, ele altera automaticamente os campos em baixo.
Se alguem puder me ajudar!!!
Obrigado
responder
WipeOutSurfer escreveu:
Quero agradecer ao post e tirar uma dúvida: se eu trabalho o atributo value, e este é um número, no entanto, quero que ele me mostre o título e não a id, só que a id é que faz funcionar, como eu mascaro o número ou, como duplico a chamada sem dar erro?
ex:
opçao 1 vinda de id + titulo
opção mostrada 2 vinda do id + outras opções
Resultado: opção 1 = número XX, e opção 2 = itens corretos.
o código é parecido com isso:
'.$mostrar_estado['title'].'
Desta forma eu mostro a id + nome, no entanto, o JS e o JSON nao trabalham, sendo que em ambos já tentei adicionar itens, mudar, mover...
Fico grato por já existir este post, se alguem tiver uma dica, agradeceria!
responder
adriano escreveu:
eu não conseguir colocar pra funcionar, alguem tem um exemplo funcionando
responder
Victor Hugo Rodrigues Borges escreveu:
Fiz no mysql funcionou muito bem e agora estou tentando passar para o SQL Server 2008 e consigo carregar a combo de estados só que na de cidades não está trazendo as cidades correspondentes. Caro Davi me dê uma luz.
ats
Victor Hugo
responder
Victor Hugo escreveu:
Davi analisa este codigo, pois na hora que seleciono o estado, mostra aguarde carregando e nao mostra as cidades.
Cidade:
Aguarde, carregando...
-- Escolha um estado --
google.load('jquery', '1.3');
$(function(){
$('#IDestado').change(function(){
if( $(this).val() ) {
$('#IDcidade').hide();
$('.carregando').show();
$.getJSON('cidades.ajax.php?search=',{IDestado: $(this).val(), ajax: 'true'}, function(j){
var options = '';
for (var i = 0; i < j.length; i++) {
options += '' + j[i].cidade + '';
}
$('#IDcidade').html(options).show();
$('.carregando').hide();
});
} else {
$('#IDcidade').html('– Escolha um estado –');
}
});
});
responder
Victor Hugo escreveu:
Não sei se é na chamada ou neste código que ele não está fazendo a busca das cidades correspondentes.
<?php
header( 'Cache-Control: no-cache' );
header( 'Content-type: application/xml; charset="utf-8"', true );
$IDestado = $_GET['IDestado'];
$cidades = array();
$sql = "SELECT IDcidade, cidade
FROM tb_cidade
WHERE IDestado=$IDestado
ORDER BY cidade";
$consulta = $conn_principal->prepare($sql);
$consulta ->execute();
$resultado = $consulta->fetchAll();
$qnt_resultados= count($resultado);
if($qnt_resultados>0){
foreach($resultado as $reg)
{
$cidades[] = array(
'IDcidade' => $reg['IDcidade'],
'cidade' => $reg['cidade'],
);
}
}
echo( json_encode( $cidades ) );
?>
responder
11closed escreveu:
olá a demostração não esta fucionando abri o IE e chrome
não funciono
t+
responder
Davi Ferreira escreveu:
Corrigido, valeu! :)
responder
jurandir parissente escreveu:
usei seu codigo e está funcionando perfeitamente no firefox e no crome, mas no IE não funciona nem a pau alguem tem alguma sujestão? mas o de demostração do do Davi funciona perfeitamente no IE.
link de testes
http://www.axiaki.com.br/cidade_estados.php
tenta abri-lo no IE.
responder
jurandir parissente escreveu:
usei seu codigo e está funcionando perfeitamente no firefox e no crome, mas no IE não funciona nem a pau alguem tem alguma sujestão? mas o de demostração do do Davi funciona perfeitamente no IE.
link de testes
http://www.axiaki.com.br/cidade_estados.php
tenta abri-lo no IE.
responder
jurandir parissente escreveu:
Já achei o problema!
é só trocar a versão jquery
google.load('jquery', '1.3')
por esta.
google.load('jquery', '1.6.1');
aí funciona em todos IE,CRO, FF
obrigado pela sua bela postem!!
jura.
responder
Mirella Sena escreveu:
Coloquei o código só que quando seleciono o estado, aparece carregando as cidades e as cidades não carregam, preciso de mais alguma coisa para esse código rodar?
responder
marcos escreveu:
olá,
leiam também:
http://code.google.com/p/cidades-estados-js/
responder
thiago escreveu:
Como colocar um seletor no jquery, pois ae no caso ecolheria um dos dois formularios um para o de estado /cidade, e outro para cidades/bairro.
responder
eduardo escreveu:
amigo
O codigo funciona perfeitamente, no mysql fica o id da cidade. Como faço para aparecer no PHP o nome da Cidade ao inves do codigo.?
responder
Fabio William Conceição escreveu:
echo $dados['nome'];
Lembrando que isso é apenas uma exemplificação.
responder
Danilo escreveu:
Olá Pessoal,
Boa noite.
Davi, excelente tutorial!
Estou com uma dúvida, como eu posso fazer para receber os valores dos options selecionado em outra página?
Abraços.
Att,
Danilo S. Toledo
responder
Thiago Machado escreveu:
Eu so coloquei um utf8_encode no arquivo que retorna a informação de cidades e deu tudo certo...
responder
Rogerio Coli escreveu:
Olá Davi, parabéns pelo artigo. Gostaria somente de alertá-lo que há um pequeno erro no seu código. Na linha 9 de "Populando o select" está faltando a concatenação "+". Abraço.
responder
Davi Ferreira escreveu:
Valeu, Rogerio, corrigido :)
responder
Rogerio Coli escreveu:
Olá Davi, segui sua sugestão e dei uma melhorada no código tornando a função mais dinâmica. Dá um confere no link: http://www.rcoli.com.br/2011/12/jquery-e-ajax-combo-de-estado-e-cidade/ e deixa um comentário lá. Abraço.
responder
Edinei Enrique Ricardo escreveu:
Amigão BOM Code!!!
Mais no BD tem um erro grave!!
Esta Sapiranga como sidade de SC!!
Deus me livre deixa la pro RS!!!
Ha ha!!
responder
juliano escreveu:
Olá amigo,
preciso fazer um select aassim para acessar 4 base de dados diferentes...
gostaria de fazer um primeiro select para definir a base, no caso só preciso definir usuario e senha diferente: Ex:
Selec
base1 -> $user = usuario_base1 $senha= senha_base1
base2 -> $user = usuario_base2 $senha= senha_base2
...
só atribuir valores diferentes para o $user e $senha.
Obrigado.
att,
Juliano
responder
alysson escreveu:
Gostei do seu artigo.
Poderia me auxiliar no meu codigo?
$(function(){
$('#tipo_receita')
.live(
'click', function(e)
{
mostra();
return false;
}
);
var mostra = function()
{
alert($('#tipo_receita').val());
}
});
Mas nada acontece quando aciono o select #tipo_receita.
responder
Eduardo escreveu:
Fala david, estou usando seu código para outra coisa e ta porém na hora de inserir no bd, as variáveis que são passadas pelo jason encode no caso(cidades) para option, estão indefinidas, no caso não estou conseguindo pegar pelo post e add no bd... att Eduardo
responder
Emmanuel escreveu:
resolvi o problema do NULL assim
while ( $row = mysql_fetch_assoc( $sql ) ) { $cidades[] = array( 'cod_cidades' => $row['cod_cidades'], 'nome' => htmlentities($row['nome'], NULL, 'latin1'), ); }responder
André Buzzo escreveu:
Fala Davi!
Obrigado por compartilhar esse código meu velho! Adaptei-o para aquilo que eu precisava aqui.
Tenho clientes considerados "Matriz" e outros atrelados a ele, que são as Filiais,
Precisa que, ao selecionar uma Matriz, as Filiais fossem exibidas, e seu código caiu como uma luva.
Agradeço imensamente.
Forte abraço e fica com Deus!
Até a próxima!
responder
seedq escreveu:
Viu como colocar em uma página duas vezes tentei e não deu certo.
responder
Betinho Cerri escreveu:
Bom Dia Davi...
Cara muito bom seu código, e estou tentando adaptar a minha necessidade só que conheço muito pouco jQuery e infelizmente não consigo resolver o problema.
Mais enfim, minha dúvida é a seguinte:
Estou montando um sisteminha educacional e em meu formulário de cadastro de questão possuo 4 selects a serem populados.
1º Nível de Ensino (Ensino Fundamental,Médio e etc...)
2º Área de Ensino (Humanas, Exatas...)
3º Disciplina (Matemática, Geografia e etc...)
4º Assunto (Geometria, Trigonometria...)
Enfim, como vc percebeu vou filtrando resultados do banco de dados...
E meu problema está no 3 e 4 select a ser populado, pois preciso usar na busca em meu banco de dados do campo Disciplina (por exemplo), duas variáveis PHP ($nivel_ensino e $area_ensino):
"SELECT id, nome FROM disciplina WHERE area_ensino_nivel_ensino_id='$nivel_ensino' AND area_ensino_id='$area_ensino' ORDER BY nome;"E para isso estou tentando usar 2 vezes o $_REQUEST...
$nivel_ensino = mysql_real_escape_string($_REQUEST['nivel_ensino']); $area_ensino = mysql_real_escape_string($_REQUEST['area_ensino']);Como não estava dando certo, resolvi tentar alterar o código jQuery, e fiz a seguinte modificação (lembrando que entendo pouquíssimo de js):
$.getJSON('inserir_questao_2_disciplina.ajax.php?search=',{area_ensino: $(this).val(), nivel_ensino: $(this).val(), ajax: 'true'}, function(j){Essa modificação até carrega o select, porém a busca não trás nenhum resultado, o que deixa o Select em branco...
Portanto esse é meu problema com o campo Disciplina, já no campo assunto onde preciso usar 3 variáveis na busca do banco de dados, estou mais perdido ainda!
Por favor, se vc poder me ajudar a descobrir como fazer o jQuery enviar mais que uma variável para o PHP, isso irá me ajudar muito...
Grande abraço!
responder
Davi Ferreira escreveu:
Fala Cerri,
o problema é que você está utilizando $(this) para todos os parâmetros, ou seja, você está passando o mesmo valor para todas as variáveis.
Teria que ser algo do tipo:
$.getJSON('inserir_questao_2_disciplina.ajax.php?search=',{area_ensino: $('#area_ensino').val(), nivel_ensino: $(this).val(), ajax: 'true'}, function(j){Você precisa pegar o valor do select com o atributo ID. O this é apenas o elemento que está ativando o change.
responder
Betinho Cerri escreveu:
Opaaa, primeiro obrigado Davi Ferreira por responder minha dúvida...
O que resolveu meu problema (não sei se é uma técnica correta ou não) foi a seguinte modificação no jQuery:
$.getJSON('inserir_questao_2_disciplina.ajax.php?search=',{area_ensino: $('#area_ensino').val(), nivel_ensino: $('#nivel_ensino').val(), ajax: 'true'}, function(j){E lógico mantive os dois $_REQUESTs no código PHP:
$nivel_ensino = mysql_real_escape_string($_REQUEST['nivel_ensino']); $area_ensino = mysql_real_escape_string($_REQUEST['area_ensino']);responder
PRNS escreveu:
show muito show grato ae daviferreira
funcionou 99% aconteceu que quando executa faz a busca direitinho preenche tudo certinho so aparece a seguinte mensagem
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in D:\wamp\www\futemais\cidades.ajax.php on line 15
so que tentei arrumar e nada e depois acabei ocultando assim
"line 15" >> while ( @$row = mysql_fetch_assoc($res) ) {
será que tem alguem problema fazer isso ocultar com o arroba?
grato ae daviferreira.
responder
prns escreveu:
outra pergunta davi ferreira e belo post diga-se de passagem, quando eu insiro os dados no banco de dados mysql em vez da sigla do estado e o nome da cidade fica aparecendo os codigos o que dificulta a consulta.
a alguma solução pra isso?
grato
responder
Charlie escreveu:
Primeiramente parabens pelo post e bem esclarecedor, so tem uma coisa este codigo funciona bem fora de um proxy , sóh que quando acessado via proxy ele não funciona trava no carregamento,você teria alguma sugestão para correção deste bug
Abraço
responder
Elvis escreveu:
Funcionou perfeitamente!
Tive um pouco de dificuldade com a acentuação mas resolvi com o código postado em seus comentários
mysql_query("SET NAMES 'utf8'", $con); mysql_query('SET character_set_connection=utf8', $con); mysql_query('SET character_set_client=utf8', $con); mysql_query('SET character_set_results=utf8', $con);
Lembrando que:
$con = mysql_connect( 'localhost', 'root', 'root' ) ;
Muito Obrigado!
E espero ajudar alguém que esteja com o mesmo probleminha rs (null)
responder
Jeferson escreveu:
Boa noite.Alguem pode me ajudar ? Está dando erro. Sempre que eu escolho o estado, aparece a mensagem carregando ... e em seguinda aparece o seguinte erro :
"httpd.exe-Erro de aplicativo
a instriução no 0x0107xx80 fez referencia a memoria 0x000000010.A memoria nao pode ser "read"
Nao tenho a menor ideia de como resolver isso !!
att.
Jeferson
responder
fa escreveu:
gabra
responder
s escreveu:
muito bom!
responder
s escreveu:
muito bom!
responder
Jether escreveu:
Muito bom, Meus agradecimentos por compartilhar comhecimento.
responder
Alaerte Gabriel de Santos escreveu:
Pessoa é muito simples resolver o problema de quem não conseque listar as cidades, ou quando elas aparecem com NULL. A causa disso, é os acentos nos nomes, basta modificar a linha do arquivo PHP, esta aqui:
while ($row = mysql_fetch_assoc($res)) { $cidades[] = array('cod_cidades' => $row['codigo'], 'nome' => $row['nome'],); }Basta adicionar o utf8_encode(), ficando assim:
while ($row = mysql_fetch_assoc($res)) { $cidades[] = array('cod_cidades' => $row['codigo'], 'nome' => utf8_encode($row['nome']),); }Em alguns servidores, o $_REQUEST não funciona, utilizem o $_GET que é o modo a que se refere o arquivo ajax.
$cod_estados = mysql_real_escape_string($_GET['cod_estados']);Abraços.
responder
Leonardo escreveu:
Parabens pelo script!
Por acaso tem como colocar a capital do estado primeiro?
responder
Thiago dos anjos escreveu:
Estou utilizando o seu código. Li os comentários acima e graças a Deus não tive nenhum dos erros citados rs. Mas estou querendo enviar o nome da cidade e o nome do estado escolhido para um email através de um formulário de contato, estou utilizando o seguinte código php para pegar os dados enviados via $_POST
$body.= "Estado: ".$_POST["cod_estados"]."
";
$body.= "Cidade: ".$_POST["cod_cidades"]."
";
Só que ao invés de enviar o nome do estado e o nome da cidade, envia o código ...
Como faço para pegar o nome ao invés do código ? Alguém pode me ajudar ?
Abraços.
responder
marcel escreveu:
tambem to com o mesmo problema, mas consegui mudar apenas o nome da cidade ao invés dos código cidade veja mais para baixo
$cidades[] = array(
'cod_cidades'=> $row['cod_cidades']//este consegui fazer mudando por //'cod_cidades'=>$row['nome'],
agora to quebrando a cabeça como eu mudo do estado
abraço espero ter ajudado
responder
Luiz Ricardo escreveu:
Ola amigos algum pode me dá uma luz?
E o seguinte o que eu preciso é isso ai mesmo, só preciso linkar as cidades com as determinadas paginas.
Alguem pode Me dá uma luz?
responder
Fernando escreveu:
Olá pessoal, para resolver o problema do "null" no retorno basta vocês muda uma linha que tudo é resolvido.
Código original em "cidades.ajax.php"
$cidades[] = array(
'cod_cidades' => $row['cod_cidades'],
'nome' => ($row['nome']),
);
lá em ($row['nome']); mude para (utf8_encode($row['nome'])),
Abraços.
responder
Marcel escreveu:
Estava muito precisando de um código deste; mas a minha preocupação é o seguinte eu coloquei no meu formulário e quando eu mando cadastrar o estado esta mostrando o numero de indendificação do estado e não o nome do estado no meu mysql o que pode ser que esta acontecendo??? pois consegui mudar o da cidade que estava tambem fazendo isso agora eu consigo vizualizar o nome da cidade ex:
<?php
header( 'Cache-Control: no-cache' );
header( 'Content-type: application/xml; charset="utf-8"', true );
$con = mysql_connect( 'localhost', 'root', '' ) ;
mysql_select_db( 'cidades', $con );
mysql_set_charset('utf8', $con);
$cod_estados = mysql_real_escape_string( $_REQUEST['cod_estados'] );
$cidades = array();
$sql = "SELECT cod_cidades, nome
FROM cidades
WHERE estados_cod_estados=$cod_estados
ORDER BY nome";
$res = mysql_query( $sql );
while ( $row = mysql_fetch_assoc( $res ) ) {
$cidades[] = array(
'cod_cidades'=> $row['cod_cidades']//este consegui fazer mudando por // $row['nome'],
'nome' => $row['nome'],
);
}
echo( json_encode( $cidades ) );
responder
marcel escreveu:
E´pelo o que to vendo vou ter que usar outro exemplos na net pois só consigo que aparece o nome somente da cidade e o codigo do estado, e não o nome do estado pois como vou depois de a pessoa cadastrar em um BD usar como combo dinamico como ESTADO CIDADE e CATEGORIA não adianta mostrar o código na minha DB do estado como eles vão saber que estado é !!!!!!!!
quando achar um melhor eu posto aqui
responder