Ir para conteúdo

POWERED BY:

Arquivado

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

D'Emery

[Resolvido] Erro PHP + Ajax

Recommended Posts

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

não tem nada errado com o envio ...

 

poste a estrutura das tabelas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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

É, 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

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

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

×

Informação importante

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