AJAX - Błąd Response.XML

0

Witam,
Mam problem z AJAX'em. Chce zrobić coś takiego, że po wybraniu opcji z jednego selecta, ładuje się drugi select. Jednak drugi select sie nie laduje i wywala mi błąd przy warunku na r.ResponseXML == null, jednak responseText jest ok. Plik XML generowany jest przez PHP i wyświetla się poprawnie w przeglądarce. Gdzie może być błąd?

index.php

function getXMLHttpRequest() {
   var request = false;
   try {
     request = new XMLHttpRequest();
   } catch(err1) {
     try {
       request = new ActiveXObject('Msxml2.XMLHTTP');
     } catch(err2) {
       try {
         request = new ActiveXObject('Microsoft.XMLHTTP');
       } catch(err3) {
         request = false;
       }
     }
   }
   return request;
 }
 var r;
 r = getXMLHttpRequest();

function ajax(param){
 	r.open('GET', 'response.php?'+param, true);
	r.onreadystatechange = processResponse;
	r.send(null);
}

function processResponse(){
if (r.readyState == 4) {
     if (r.status == 200) {	

		 if(r.ResponseXML==null || !r.ResponseXML.documentElement) alert("niepoprawna struktura xml: \n" + r.responseText);
            var rootNodeName = r.ResponseXML.documentElement.nodeName;
            if(rootNodeName == "parsererror") alert("Niepoprawna struktura xml");
		 var root = r.ResponseXML.getElementsByTagName('response')[0];
		 var lekarze = root.getElementsByTagName('lekarze')[0];
		 var lekarz = lekarze.getElementsByTagName('lekarz')[0];
		
		 for(var i=0; i<lekarz.length; i++){
		  document.getElementById("lekarz").options[i] = new Option(lekarz[i].getElementsByTagName('id')[0].firstChild.nodeValue, lekarz[i].getElementsByTagName('im_naz')[0].firstChild.nodeValue);
		 }
}
}
}

//...
 <select name="poradnia" id="poradnia" onChange="ajax('param=lekarz&id='+document.getElementById('poradnia').value);">
//<opcje>
</select>
<select name="lekarz" id="lekarz"></select>

response.php

<?php
header('Content-type: text/xml');
require ("mysql_ap.php");
$param = strip_tags($_GET['param']);
$id = strip_tags($_GET['id']);
$query = "SELECT id_lekarza FROM Lekarz_poradnia WHERE id_poradni='".$id."'";
$result = mysql_query($query) or die ("Blad przy wykonywaniu zapytania: " .mysql_error());
$num = mysql_num_rows($result);
if ($num > 0) 
{
	$zmienna='<?xml version="1.0" encoding="utf-8" ?>';
	$zmienna.='<response>';
	$zmienna.= '<lekarze>';
	while($lek = mysql_fetch_row($result))
	{
		$zmienna.='<lekarz>';
		$result2 = mysql_query("SELECT id_personelu, imie, nazwisko FROM Dane_personelu WHERE id_personelu='".$lek[0]."'");
		if(mysql_num_rows($result2)>0)
		{
			 while ($row = mysql_fetch_array($result2)) {
					  $zmienna.='<id>'.$row["id_personelu"].'</id>';
					  $zmienna.='<im_naz>'.$row["imie"].$row["nazwisko"].'</im_naz>';
				}
		}
		$zmienna.='</lekarz>';
	}
	$zmienna.='</lekarze>';
	$zmienna.='</response>';
	echo $zmienna;
}
else 
{
	echo "Nie ma rekordów w bazie!";
}
?>
0

Ty się katujesz, piszesz kod na 100 parę linijek, a ja sobie wygeneruję po prostu <select>, wyślę go przez skrypt, odbiorę i wstawię do innerHTML. Po co się z tym XMLem katować?

0

r.responseXML , a nie r.ResponseXML ;-)

0

No ale po co się z tym bawić? Robisz od razu w PHP select, a nie jakiś szmaciany XML i wysyłasz go w świat. Skrypt JS wstawia go do innerHTML i problem rozwiązany, a 30 innych problemów załatwione.

0
korys napisał(a)

Witam,
Mam problem z AJAX'em. Chce zrobić coś takiego, że po wybraniu opcji z jednego selecta, ładuje się drugi select. Jednak drugi select sie nie laduje i wywala mi błąd przy warunku na r.ResponseXML == null, jednak responseText jest ok. Plik XML generowany jest przez PHP i wyświetla się poprawnie w przeglądarce. Gdzie może być błąd?

index.php

function getXMLHttpRequest() {
   var request = false;
   try {
     request = new XMLHttpRequest();
   } catch(err1) {
     try {
       request = new ActiveXObject('Msxml2.XMLHTTP');
     } catch(err2) {
       try {
         request = new ActiveXObject('Microsoft.XMLHTTP');
       } catch(err3) {
         request = false;
       }
     }
   }
   return request;
 }
 var r;
 r = getXMLHttpRequest();

function ajax(param){
 	r.open('GET', 'response.php?'+param, true);
	r.onreadystatechange = processResponse;
	r.send(null);
}

function processResponse(){
if (r.readyState == 4) {
     if (r.status == 200) {	

		 if(r.ResponseXML==null || !r.ResponseXML.documentElement) alert("niepoprawna struktura xml: \n" + r.responseText);
            var rootNodeName = r.ResponseXML.documentElement.nodeName;
            if(rootNodeName == "parsererror") alert("Niepoprawna struktura xml");
		 var root = r.ResponseXML.getElementsByTagName('response')[0];
		 var lekarze = root.getElementsByTagName('lekarze')[0];
		 var lekarz = lekarze.getElementsByTagName('lekarz')[0];
		
		 for(var i=0; i<lekarz.length; i++){
		  document.getElementById("lekarz").options[i] = new Option(lekarz[i].getElementsByTagName('id')[0].firstChild.nodeValue, lekarz[i].getElementsByTagName('im_naz')[0].firstChild.nodeValue);
		 }
}
}
}

//...
 <select name="poradnia" id="poradnia" onChange="ajax('param=lekarz&id='+document.getElementById('poradnia').value);">
//<opcje>
</select>
<select name="lekarz" id="lekarz"></select>

response.php

<?php
header('Content-type: text/xml');
require ("mysql_ap.php");
$param = strip_tags($_GET['param']);
$id = strip_tags($_GET['id']);
$query = "SELECT id_lekarza FROM Lekarz_poradnia WHERE id_poradni='".$id."'";
$result = mysql_query($query) or die ("Blad przy wykonywaniu zapytania: " .mysql_error());
$num = mysql_num_rows($result);
if ($num > 0) 
{
	$zmienna='<?xml version="1.0" encoding="utf-8" ?>';
	$zmienna.='<response>';
	$zmienna.= '<lekarze>';
	while($lek = mysql_fetch_row($result))
	{
		$zmienna.='<lekarz>';
		$result2 = mysql_query("SELECT id_personelu, imie, nazwisko FROM Dane_personelu WHERE id_personelu='".$lek[0]."'");
		if(mysql_num_rows($result2)>0)
		{
			 while ($row = mysql_fetch_array($result2)) {
					  $zmienna.='<id>'.$row["id_personelu"].'</id>';
					  $zmienna.='<im_naz>'.$row["imie"].$row["nazwisko"].'</im_naz>';
				}
		}
		$zmienna.='</lekarz>';
	}
	$zmienna.='</lekarze>';
	$zmienna.='</response>';
	echo $zmienna;
}
else 
{
	echo "Nie ma rekordów w bazie!";
}
?>

Trochę nie na temat... ale dzięki za podpowiedź o wysłaniu nagłówku "header("Content-type: text/xml")"
bez tego miałem już cudować coś po stronie serwera z plikiem .httaccess czy jakimś podobnym aby przkłamywać w nazwach plików php na xml.

1 użytkowników online, w tym zalogowanych: 0, gości: 1