D'Emery 0 Denunciar post Postado Setembro 6, 2010 Olá meus caros, Estou com uma dor de cabeça muito forte, de não conseguir resolver esse problema. Existe duas tabelas, cujo todas elas são popularizadas (não existe marca sem modelos): carro_marca codigo marca carro_modelo codigo codigo_marca modelo Criei um formulário de cadastro de carros, ao usuário cadastrar seu carro ele seleciona primeiro o select de name codigo_marca e o Ajax joga os todos as options para o select de name codigo_modelo. formulário.php <tr> <td class="esquerda"> <span class="texto"> <b>Marca</b> </span> </td> <td class="direita"> <select name="codigo_marca" id="codigo_marca" class="select" onChange="Dados(this.value);"> <option value="" selected="selected">Selecione a Marca</option> <? $modelos = "SELECT DISTINCT codigo_marca FROM carro_modelo"; $query_modelos = mysql_query($modelos); if($query_modelos){ $rows_modelos = mysql_num_rows($query_modelos); if($rows_modelos > 0){ for($mod=0; $mod<$rows_modelos; $mod++){ $codigo_marca = mysql_result($query_modelos,$mod,codigo_marca); if($codigo_marca){ $marcas = "SELECT * FROM carro_marca WHERE codigo='$codigo_marca'"; $query_marcas = mysql_query($marcas); if($query_marcas){ $marca = mysql_result($query_marcas,0,marca); ?> <option value="<?=$codigo_marca;?>"><?=$marca;?></option> <? } } } } } ?> </select> </td> </tr> <tr> <td class="esquerda"> <span class="texto"> <b>Modelo</b> </span> </td> <td class="direita"> <select name="codigo_modelo" id="codigo_modelo" class="select"> <option id="opcoes" value="" selected="selected">Selecione a Marca</option> </select> </td> </tr> O erro está ai, o Ajax não envia os options de algumas marcas a exemplo da Chevrolet, Renault, entre outros. Segue abaixo o código do Ajax (ajax-carros.php) e também da consulta (modelos.php) ajax-carros.php function Dados(valor) { //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.forms[0].codigo_modelo.options.length = 1; idOpcao = document.getElementById("opcoes"); ajax.open("POST", "modelos.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 processXML que vai varrer os dados if(ajax.readyState == 4 ) { if(ajax.responseXML) { processXML(ajax.responseXML); } else { //caso não seja um arquivo XML emite a mensagem abaixo idOpcao.innerHTML = "Selecione a Marca"; } } } //passa o código do estado escolhido var params = "codigo_marca="+valor; ajax.send(params); } } function processXML(obj){ //pega a tag cidade var dataArray = obj.getElementsByTagName("codigo_modelo"); //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("modelo")[0].firstChild.nodeValue; idOpcao.innerHTML = "Selecione o Modelo"; //cria um novo option dinamicamente var novo = document.createElement("option"); //atribui um ID a esse elemento novo.setAttribute("id", "opcoes"); //atribui um valor novo.value = codigo; //atribui um texto novo.text = descricao; //finalmente adiciona o novo elemento document.forms[0].codigo_modelo.options.add(novo); } } else { //caso o XML volte vazio, printa a mensagem abaixo idOpcao.innerHTML = "Selecione a Marca"; } } modelos.php <? //CONECTA AO MYSQL include("provisorio/auxiliares/conexao.php"); $codigo_marca = $_POST["codigo_marca"]; $modelos = "SELECT * FROM carro_modelo WHERE codigo_marca='$codigo_marca'"; $query_modelos = mysql_query($modelos); if($query_modelos){ $rows_modelos = mysql_num_rows($query_modelos); if($rows_modelos > 0){ $xml .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"; $xml .= "<modelos>\n"; for($cm>=0;$cm<$rows_modelos;$cm++) { $carro_codigo_modelo = mysql_result($query_modelos,$cm,codigo); $carro_modelo = mysql_result($query_modelos,$cm,modelo); $xml .= "<codigo_modelo>\n"; $xml .= "<codigo>".$codigo_modelo."</codigo>\n"; $xml .= "<modelo>".$modelo."</modelo>\n"; $xml .= "</codigo_modelo>\n"; } $xml .= "</modelos>\n"; Header("Content-type: application/xml; charset=iso-8859-1"); echo $xml; } ?> O site que está sendo usando isso é o: www.nitroso.com.br Agradeço desde já a ajuda! Bom feriado a todos! Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 6, 2010 não tem nada errado com o envio ... poste a estrutura das tabelas. Compartilhar este post Link para o post Compartilhar em outros sites
D'Emery 0 Denunciar post Postado Setembro 6, 2010 não tem nada errado com o envio ... poste a estrutura das tabelas. Ok! Tô te passando a estrutura das tabelas. carro_marca CREATE TABLE `carro_marca` ( `codigo` int(11) NOT NULL auto_increment, `marca` text NOT NULL, PRIMARY KEY (`codigo`) ) ENGINE=MyISAM AUTO_INCREMENT=34 DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ; carro_modelo CREATE TABLE `carro_modelo` ( `codigo` int(11) NOT NULL auto_increment, `codigo_marca` int(11) NOT NULL default '0', `modelo` text NOT NULL, PRIMARY KEY (`codigo`) ) ENGINE=MyISAM AUTO_INCREMENT=327 DEFAULT CHARSET=latin1 AUTO_INCREMENT=327 ; Não sei se ajuda, mas olhem o formulário do www.nitroso.com.br Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 6, 2010 faz o seguinte, muda pra GET o arquivo php $codigo_marca = $_GET["codigo_marca"]; para conseguirmos debugar. http://www.nitroso.com.br/modelos.php?codigo_marca=9 ... Compartilhar este post Link para o post Compartilhar em outros sites
D'Emery 0 Denunciar post Postado Setembro 6, 2010 faz o seguinte, muda pra GET o arquivo php $codigo_marca = $_GET["codigo_marca"]; para conseguirmos debugar. http://www.nitroso.com.br/modelos.php?codigo_marca=9 ... Já tentei via GET, vou tentar novamente pra ver o que acontece! Compartilhar este post Link para o post Compartilhar em outros sites
Mecho com php e Html 0 Denunciar post Postado Setembro 6, 2010 O erro não seria nessas linhas:? arquivo modelos.php $xml .= "<codigo_modelo>\n"; $xml .= "<codigo>".$codigo_modelo."</codigo>\n"; //a variável codigo_modelo não existe, mas sim, carro_codigo_modelo $xml .= "<modelo>".$modelo."</modelo>\n";//o mesmo aqui! $xml .= "</codigo_modelo>\n"; o certo não seria: $xml .= "<codigo_modelo>\n"; $xml .= "<codigo>".$carro_codigo_modelo."</codigo>\n"; $xml .= "<modelo>".$carro_modelo."</modelo>\n"; $xml .= "</codigo_modelo>\n"; Compartilhar este post Link para o post Compartilhar em outros sites
D'Emery 0 Denunciar post Postado Setembro 6, 2010 Percebi que o if($query_modelos) não estava fechado! Após a correção o XML ta incompleto, aparecendo desse jeito: <modelos> <codigo_modelo> </codigo> </modelo> </codigo_modelo> </modelos> Não era para aparecer o <codigo>CÓDIGO DO MODELO DO CARRO</codigo> e <modelo>MODELO DO CARRO</modelo> ??? Agora deu!!! http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif Compartilhar este post Link para o post Compartilhar em outros sites
D'Emery 0 Denunciar post Postado Setembro 6, 2010 Acho que encontrei o erro!!! Hehehe Logo após ter visto o erro estrutural (do if($query_modelos)), o XML mandou a seguinte resposta: Erro no processamento de XML: entidade não definida Posição: http://www.nitroso.com.br/modelos.php?codigo_marca=3 Número da linha 109, coluna 14:<modelo>Marajó</modelo> Isso que dizer, no MySQL, as marcas que tiverem modelos com acento (já que eu cadastrei com códigos HTML) não seram aceitos. Então tenho que decodificar com $modelo = html_entity_decode($modelo, ENT_QUOTES); Espero está certo! Compartilhar este post Link para o post Compartilhar em outros sites
D'Emery 0 Denunciar post Postado Setembro 6, 2010 É, não é isso!!! Tá difícil!!! Pelo menos sei que o erro de não aparecer os modelos de algumas marcas que é essa marca possui algum (ou mais de um) modelo com acento. E no MySQL o acento está em forma de código (exemplo o: á - á). Agora não sei como mudar isso, porque coloque o $modelo = html_entity_decode($modelo, ENT_QUOTES); e ele não carrega os modelos do mesmo jeito! O erro não seria nessas linhas:? arquivo modelos.php $xml .= "<codigo_modelo>\n"; $xml .= "<codigo>".$codigo_modelo."</codigo>\n"; //a variável codigo_modelo não existe, mas sim, carro_codigo_modelo $xml .= "<modelo>".$modelo."</modelo>\n";//o mesmo aqui! $xml .= "</codigo_modelo>\n"; o certo não seria: $xml .= "<codigo_modelo>\n"; $xml .= "<codigo>".$carro_codigo_modelo."</codigo>\n"; $xml .= "<modelo>".$carro_modelo."</modelo>\n"; $xml .= "</codigo_modelo>\n"; Verdade Caio, ajeitei isso também ao perceber o erro do if($query_modelos). Compartilhar este post Link para o post Compartilhar em outros sites
William Bruno 1501 Denunciar post Postado Setembro 6, 2010 tenta assim: $xml .= "<modelo>".html_entity_decode( $carro_modelo )."</modelo>\n"; mas tá meio confuso mesmo o fetch ali... troca por um _assoc, ou _object (no lugar do _result) Compartilhar este post Link para o post Compartilhar em outros sites
D'Emery 0 Denunciar post Postado Setembro 6, 2010 tenta assim: $xml .= "<modelo>".html_entity_decode( $carro_modelo )."</modelo>\n"; mas tá meio confuso mesmo o fetch ali... troca por um _assoc, ou _object (no lugar do _result) Perfeito, só colocar o html_entity_decode($carro_modelo), sem o ENT_QUOTES, que ele funcionou perfeitamente! Obrigado Willian e Caio!!! Compartilhar este post Link para o post Compartilhar em outros sites