Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Problemas com busca cidade (ajax)

Recommended Posts

Pessoal, no link abaixo:

http://nutrirmais.com.br/loja2/clientes_cad.php

Tenho um formulário de cadastro de clientes.
Nesse formulário, tenho uma combobox (select option) para os estados brasileiros e outra combo para listar as cidades brasileiras.

Acontece que quando champo a função DadosCidade de dentro da Select dos Estados, dá erro e nem o navegador me informa esse erro.

No formulário esta assim:

  <label id="label_estado_cad_clientes" for="estado_cad_clientes">Estado :</label>
  <?php
    $estados_regiao_string =
"select sigla, nome from estados where regiao=".$_SESSION["id_regioes"]." order by nome";
$estados_regiao_query= $conexao->query($estados_regiao_string);
  ?>
  <select name="estado_cad_clientes" id="estado_cad_clientes" onchange="DadosCidade(this.value,this.form.name,'cidade_cad_clientes');"  size="1" style="width:200px">
  <option value='#'>Escolha o estado</option>
  <?php
  while(list($sigla, $nome)=$estados_regiao_query->fetch_row())
  {
    echo "<option value='$sigla'>$nome</option>";
  }
  ?>
  </select> <br />

  <label id="label_cidade_cad_clientes" for="cidade_cad_clientes">Cidade :</label>

  <select name="cidade_cad_clientes"  id="cidade_cad_clientes" size="1" style="width:200px">

  <option id="opcoescidade" value="#">Primeiro selecione o estado!</option>

  </select>

Observação: Os estados retornam normalmente.

Podem me ajudar?

Eis o arquivo php que faz a leitura. (Obs: O php esta fazendo a leitura corretamente).

<?php
include("../config/conexao.php");

$sql_string = "SELECT id, nome FROM  cidades WHERE estado = '".$_POST["estado"]."' ORDER BY nome";            
$sql_query = $conexao->query($sql_string);  
$row = $sql_query->num_rows;

//VERIFICA SE VOLTOU ALGO

if($row)
{                
   //XML
   $xml  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
   $xml .= "<cidades>\n";              

   //PERCORRE ARRAY            
   while(list($codigo, $descricao)=$sql_query->fetch_row())
   {
      $xml .= "<cidade>\n";    
      $xml .= "<codigo>".$codigo."</codigo>\n";                  
      $xml .= "<descricao>".$descricao."</descricao>\n";        
      $xml .= "</cidade>\n";    
   }

   $xml.= "</cidades>\n";
}

echo $xml;
?>

E o ajax

   function DadosCidade(valor,form_get, campo) {
      //verifica se o browser tem suporte a ajax
try {
         ajax = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e) {
         try {
            ajax = new ActiveXObject("Msxml2.XMLHTTP");
         }
    catch(ex) {
            try {
               ajax = new XMLHttpRequest();
            }
       catch(exc) {
               alert("Esse browser não tem recursos para uso do ajax");
               ajax = null;
            }
         }
      }
//se tiver suporte ajax
if(ajax) {
    //deixa apenas o elemento 1 no option, os outros são excluídos
document.getElementById(campo).options.length =1;
idOpcao  = document.getElementById("opcoescidade");
    ajax.open("POST", "global/funcoes_php/buscacidade.php", true);
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

ajax.onreadystatechange = function() {
            //enquanto estiver processando...emite a msg de carregando
if(ajax.readyState == 1) {
  idOpcao.innerHTML = "Carregando...!";  
       }
//após ser processado - chama função processXMLCidades que vai varrer os dados
            if(ajax.readyState == 4 ) {
  if(ajax.respon---ML) {
     processXMLCidades(ajax.respon---ML,form_get, campo);
  }
  else {
      //caso não seja um arquivo XML emite a mensagem abaixo
  idOpcao.innerHTML = "Primeiro selecione o estado>>";
  }
            }
         }
//passa o código do estado escolhido
    var params = "estado="+valor;
         ajax.send(params);
      }
   }

   function processXMLCidades(obj,form_get, campo){
      //pega a tag cidade
      var dataArray   = obj.getElementsByTagName("cidade");
//total de elementos contidos na tag cidade
if(dataArray.length > 0) {
    //percorre o arquivo XML paara extrair os dados
         for(var i = 0 ; i < dataArray.length ; i++) {
            var item = dataArray[i];
//contéudo dos campos no arquivo XML
var codigo    =  item.getElementsByTagName("codigo")[0].firstChild.nodeValue;
var descricao =  item.getElementsByTagName("descricao")[0].firstChild.nodeValue;

       idOpcao.innerHTML = "Selecione uma das opções abaixo>>";

//cria um novo option dinamicamente  
var novo = document.createElement("option");
   //atribui um ID a esse elemento
   novo.setAttribute("id", "opcoescidade");
//atribui um valor
   novo.value = codigo;
//atribui um texto
   novo.text  = descricao;
//finalmente adiciona o novo elemento
document.getElementById(campo).options.add(novo);
}
}
else {
   //caso o XML volte vazio, printa a mensagem abaixo
idOpcao.innerHTML = "Primeiro selecione o estado>>";
}
   }

Parece que o

ajax.responseXML

Não esta carregando!
Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acessa no browser:

 

global/funcoes_php/buscacidade.php e vê se retorna o xml corretamente.

Caso não, trabalhe o php até retornar.

 

Lembrando de "mockar" o $_POST

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em William.

 

Pelo Browser, o php retornou o xml certim.

 

Mas notei que no início do código fonte, há uma linha vazia antes da primeira linha: <htrml ...........

 

Normalmente isso se dá por causa da assinatura BOM. E eu retiro ela corventendo de UTF-8 para UTF-8 sem BOM usando o Notepad ++.

 

Porem, procurei em todos os arqui e não achei nenhum com a assinatura BOM.

 

Pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o arquivo só tem código php, não necessita fechar a tag php

 

echo $xml;
?>
troca por

echo $xml;
Além disso, depois q fizer o request ajax, verifique no console o que acontece, se aparece erro js ou se a requisição foi realmente feita e voltou com sucesso

Ctrl + Shift + J no Firefox.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No ajax, quando chega na validação,

 

 

if(ajax.responseXML) {
     processXMLCidades(ajax.respon---ML,form_get, campo);
  }

 

Não entra nesse if.

 

Parece que retorna null mas não encontrei o porque?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Força um header de xml no php:

 

header("Content-type: text/xml");
echo $xml;

Compartilhar este post


Link para o post
Compartilhar em outros sites
Fiz não ainda não funcionou.


Estive colocando uns alerts e percebi que que quando chega nessa parte do ajax:


ajax.onreadystatechange = function() {
//enquanto estiver processando...emite a msg de carregando
if(ajax.readyState == 1) {
idOpcao.innerHTML = "Carregando...!";
}
//após ser processado - chama função processXMLCidades que vai varrer os dados
if(ajax.readyState == 4 ) {
if(ajax.responseXML) {
processXMLCidades(ajax.responseXML,form_get, campo);
}

else {
//caso não seja um arquivo XML emite a mensagem abaixo
idOpcao.innerHTML = "Primeiro selecione o estado>>";
}
}
}

Especificamente aqui:


if(ajax.responseXML) {
processXMLCidades(ajax.responseXML,form_get, campo);
}


A função processXMLCidades não esta sendo chamada por que ajax.responseXML esta retornando NULL.


Mas no Browser (ambiente de desenvolvimento), dá pra ver o retorno do xml.


Porque será isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende de muitas coisas cara, precisamos debugar para saber.

 

faz o seguinte teste:

alert(ajax.respon---ML, ajax.responseText);
if(ajax.respon---ML) {
Se voltar algo no responseText mas não no respon---ML, então é pq o servidor não está devolvendo um "xml válido".

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum, vou testar


Olha só. Testei lá!

 

http://nutrirmais.com.br/loja2/clientes_cad.php

 

Mas para o primeiro Item do alert dá null como resposta. Você pode simular uma troca de estado lá!

 

Do segundo item do alert não há retorno algum. E, as cidades não aparecem. as em Network do concole mostra as cidades normalmente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq tá voltando string e não xml. Seu php ainda não está voltando o que deveria.

 

Como está o php agora ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Php:

 

<?php 
include("../config/conexao.php"); 
 
$sql_string = "SELECT id, nome FROM  cidades WHERE estado = '".$_POST["estado"]."' ORDER BY nome";            
$sql_query = $conexao->query($sql_string);  
$row = $sql_query->num_rows; 
 
//VERIFICA SE VOLTOU ALGO 
 
if($row) 
{                
   //XML
   $xml  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
   $xml .= "<cidades>\n";               
   
   //PERCORRE ARRAY            
   while(list($codigo, $descricao)=$sql_query->fetch_row())
   {
      $xml .= "<cidade>\n";     
      $xml .= "<codigo>".$codigo."</codigo>\n";                  
      $xml .= "<descricao>".$descricao."</descricao>\n";         
      $xml .= "</cidade>\n";    
   }
   
   $xml.= "</cidades>\n";
}
//header("Content-type: application/xml; charset=utf-8");
echo $xml; 
?>

Olha só!

 

aa.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

E pq o header está comentado ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

veja no depurador acima: quando descomento o header, ao mostrar o xml, dá erro de header (cabeçalhos já foram enviados). Mas as cidades listam logo após!

 

Mas tanto comentado ou não as cidades listam normalmente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vc precisa do header! sem ele, não vai chegar um xml ai o js não lê.

Corrija o erro de headers já foram enviados, mas mantenha o header!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Corrija o erro do php, veja pq está disparando o headers already sent

 

poste o arquivo conexao.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

O php esta, quando rodo apenas ele, rotornando o XML certim.

 

O conexão é esse:

 

 

<?php 
/*
 ini_set("display_errors",1);
 ini_set("display_startup_erros",1);
 error_reporting(E_ALL);
 */
?>
 
<?php
 
 
  define('host', "localhost");
  define('db', "banco");
  define('user', "usuario");
  define('pass', "teste");
 
  $conexao = new mysqli(host,user,pass,db);
 
  $conexao->set_charset("utf8");
?>

 

Os nomes são esses mesmo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é.

Esse erro ocorre quando uso

ajax.responseText
Quando uso
ajax.responseXML
Esse erro não ocorre. Aliás, nem dá erro. Mas a combo cidades não popula!

Voltei lá no site para
ajax.responseXML
E ai ele retorna null

Achei!

Não entendi porque isso ocorre mas achei!

<?php
/*
ini_set("display_errors",1);
ini_set("display_startup_erros",1);
error_reporting(E_ALL);
*/
?>
Esse código que exibe os erros do php mesmo comentados estava interferindo!

Alguma lógica?

Deve ter fantasma nesse código. Só pode!

Comecei comentando cada linha desse trecho.

Até que só ficou o bloco de comentários e ainda tava dando erro.

Retirei o bloco de comentários e ainda tava dando erro.

Retirei as tags

 

<?php
?>

E ai o erro passou!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, e agora está chegando um XML na aba rede ?

 

Está populando ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.