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

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

adriano escreveu:

vocÊ tem esse código pra enviar não tô conseguindo rodar

responder

Alexandre Broggio

Alexandre Broggio escreveu:

Vlw pelo post ^_^

responder

Ricarte A. Barros

Ricarte A. Barros escreveu:

Bem enxuto! nota 10!

responder

Felipe

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

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

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

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

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) ou utf8_decode($nome_da_cidade).

responder

Luiz Bezerra

Luiz Bezerra escreveu:

O meu na hr que eu subo tbm nao lista as cidades.

responder

Luiz Bezerra

Luiz Bezerra escreveu:

obs: Versão do PHP 5.2.12 Versão do MySQL 5.0.85-community

responder

tiago

tiago escreveu:

como se faz esses campos de códigos, com a numeração das linhas ao lado? valeu

responder

tiago

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

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

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

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

João Paulo escreveu:

responder

João Paulo

João Paulo escreveu:

echo htmlentities($menu_sub['nome'], ENT_COMPAT, 'UTF-8')

responder

tiago

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

Perroni escreveu:

Mais um... Obrigado graças as pessoas como você que os sobrinhos evoluem.

responder

Roberto cezar

Roberto cezar escreveu:

Cara valeu show de bola o escript valeu mesmo um abraço

responder

Rafael Gilead

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

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

Davi Ferreira escreveu:

Seu servidor não tem suporte nativo a JSON. Utilize esta classe: http://mike.teczno.com/json.html.

responder

Plínio

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

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

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

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

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

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

Junior Eberhardt escreveu:

No meu aqui apareceu certinho, quando seleciono algum estado, algumas cidades aparecem listadas como null...?

responder

carolina toledo

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

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

Rene escreveu:

Oi Junior o meu tambem aparece null em alguns campos, vc consequiu resolver, como?

responder

Rodrigo Prata

Rodrigo Prata escreveu:

Usando mysql_set_charset('utf8', $con); resolve

responder

Seed

Seed escreveu:

No meu aparece em campos com acentuação , onde colocar esse código mysql_set_charset('utf8', $con); vlw

responder

Tom Santanna

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

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

elen escreveu:

valeu, valeu, valeu mesmo, sempre tive medo de usar pq achava muito complicado, funciona!!! obrigada

responder

Fábio Henrique

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

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

Fábio Henrique escreveu:

Obrigado.... já fiz isso ontem rs.... Show de bola... Parabéns... estou te seguindo no twitter também!!!

responder

Anderson

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

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

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

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

Marcelolynx escreveu:

Show de bola!

responder

Juliana

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

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

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

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

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

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

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á

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

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

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

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

Rodrigo Prata escreveu:

Resolvi o problema com valores NULL mysql_set_charset('utf8', $con);

responder

Cleiton Garcia da Silva

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

Chiquito escreveu:

Cleiton! Execelente Resposta e solução....Salvou minha aplicação!
SHOW!!!!!!!!

responder

Cleiton Garcia da Silva

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

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

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

Edinei Ricardo escreveu:

Cara como vou fazer isso se vc não colocou os nomes dos arquivos???? "Fulanodetal.php "

responder

Mario Leandro

Mario Leandro escreveu:

gosteimuito. Me ajudou bastante!

responder

Fernando Sgrignoli de Oliveira

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

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

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

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

adriano escreveu:

eu não conseguir colocar pra funcionar, alguem tem um exemplo funcionando

responder

Victor Hugo Rodrigues Borges

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

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

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

11closed escreveu:

olá a demostração não esta fucionando abri o IE e chrome
não funciono
t+

responder

Davi Ferreira

Davi Ferreira escreveu:

Corrigido, valeu! :)

responder

jurandir parissente

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

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

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

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

marcos escreveu:

olá,
leiam também:

http://code.google.com/p/cidades-estados-js/

responder

thiago

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

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

Fabio William Conceição escreveu:

echo $dados['nome'];

Lembrando que isso é apenas uma exemplificação.

responder

Danilo

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

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

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

Davi Ferreira escreveu:

Valeu, Rogerio, corrigido :)

responder

Rogerio Coli

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

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

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

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

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

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

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

seedq escreveu:

Viu como colocar em uma página duas vezes tentei e não deu certo.

responder

Betinho Cerri

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

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

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

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

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

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

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

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

fa escreveu:

gabra

responder

s

s escreveu:

muito bom!

responder

s

s escreveu:

muito bom!

responder

Jether

Jether escreveu:

Muito bom, Meus agradecimentos por compartilhar comhecimento.

responder

Alaerte Gabriel de Santos

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

Leonardo escreveu:

Parabens pelo script!
Por acaso tem como colocar a capital do estado primeiro?

responder

Thiago dos anjos

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

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

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

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

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

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

Deixe seu comentário:

(Seu e-mail não será divulgado - serve apenas para validação e gravatar.)

(Tags HTML permitidas: <strong> <em> <code> <a>)