AJAX Help - responseXML always NULL

K

KDawg44

Hi,

My responseXML is always null on my AJAX call. When I browse directly
to the PHP script I am calling, the XML file shows up just fine.

I have read that if a returned XML file is not valid, it will always
appear as null. I am just returning some basic XML like:

<?xml version='1.0' encoding='UTF-8'?>
<XMLData>
<person>kevin</person>
<person>mac</person>
<person>maltsy</person>
</XMLData>

I do not want to have to write a schema or DTD or anything if
possible. I just want to return this from a script to an AJAX call.

Is this what is causing this to happen? Is there a way around this if
it is?

Thanks.

Kevin
 
T

Thomas 'PointedEars' Lahn

KDawg44 said:
My responseXML is always null on my AJAX call.

There is no such thing as an "AJAX call". Learn to understand what you do,
and avoid commercial buzzwords.
When I browse directly to the PHP script I am calling, the XML file shows
up just fine.

If it is not displayed as a document tree, then the reason of tghe
`responseXML' property value being `null' is that you are serving it with
the wrong media type. Use text/xml or application/xml. In PHP this can be
achieved with

<?php header('Content-Type: text/xml; charset=utf-8'); ?>


PointedEars
 
P

Peter Michaux

KDawg44 said:
Hi,

My responseXML is always null on my AJAX call. When I browse directly
to the PHP script I am calling, the XML file shows up just fine.

What is the Content-Type header of the response? It should be "text/xml"
and the document should validate as valid XML.
 
K

KDawg44

What is the Content-Type header of the response? It should be "text/xml"
and the document should validate as valid XML.

The content type is text/xml. THe document tree shows up perfect when
I browse to the PHP file. Also, it works perfect in IE 7 but is not
working in firefox (which is disheartening and confusing... I am used
to that being the other way around.... :) ).

Thanks.

Kevin
 
K

KDawg44

The content type is text/xml.  THe document tree shows up perfect when
I browse to the PHP file.  Also, it works perfect in IE 7 but is not
working in firefox (which is disheartening and confusing...  I am used
to that being the other way around....  :)  ).

Thanks.

Kevin

I am still struggling with this, which is not good as I am on a tight
schedule (of course). Here is some exact code that I am using.

PHP Script on Server Side
<?php

header('Content-Type: text/xml');

include(CONNECT TO DB);

.... SOME CUT OUT FOR BREVITY ....

$xmlDoc = "<?xml version='1.0' encoding='UTF-8'?><XMLData>";
$result = verifyLogin($username, $pw);
echo $xmlDoc . $result . "</XMLData>";

.... SOME MORE CUT ....


Client Side:

function login() {
var username = document.loginForm.username.value;
var password = document.loginForm.password.value;
xmlHttp.onreadystatechange=function() {
if(xmlHttp.readyState==4) {
var xmlDoc = xmlHttp.responseXML.documentElement; <---- CULPRIT
Works fine in IE, get a 'xmlHttp.responseXML is null' error in FF 3
if (xmlDoc.getElementsByTagName("login")
[0].childNodes[0].nodeValue == "true") {
window.location="main.php"; <---- THIS IS NOT WORKING IN IE
THOUGH, no error console though.....
} else {
document.getElementByID("loginError").innerHTML =
"<center>Invalid Username and/or Password</center>"; <--- THIS ISN'T
WORKING IN IE EITHER.....
}
}
}
xmlHttp.overrideMimeType("text/xml"); <-- TRIED WITH AND WITHOUT
THIS IN FF, SAME PROBLEM
xmlHttp.open("GET","app/verifyLogin.php?un=" + escape(username) +
"&pw=" + escape(password),true);
xmlHttp.send(null);
}


Output on Direct Call to Server:

<XMLData>
<login>true</login>
</XMLData>

And if I do a 'View Source' on that Output:

<?xml version='1.0' encoding='UTF-8'?><XMLData><login>true</login></
XMLData>




Any other thoughts? I am at my wits end.....

Thank you very much for any help.

Kevin
 
T

Thomas 'PointedEars' Lahn

KDawg44 wrot:
KDawg44 wrote:
My responseXML is always null on my AJAX call. When I browse directly
to the PHP script I am calling, the XML file shows up just fine.
What is the Content-Type header of the response? It should be "text/xml"
and the document should validate as valid XML.
[...]
The content type is text/xml.

*Are* *you* *really* *really* *sure*? [psf 1.1]

See below.

Note: The "document tree" that was meant here is the automagically indented
syntax-highlighted source code in Gecko-based UAs. If it is only plain text
there, the Content-Type header of the response does not fit. MSHTML ignores
the Content-Type header and *always* displays the document tree (as it
regards it XML) if it sees ` said:
Also, it works perfect in IE 7 but is not working in firefox
(which is disheartening and confusing... I am used to that being
the other way around.... :) ).
[...]

[...]
PHP Script on Server Side
<?php

header('Content-Type: text/xml');

You should use spaces for indentation (at least when posting your code),
not tabs. And you should include the encoding declaration as well.
[...]
$xmlDoc = "<?xml version='1.0' encoding='UTF-8'?><XMLData>";

Since there is nothing to expand for PHP here, it should be the other way
around:

$xmlDoc = ' said:
$result = verifyLogin($username, $pw);
echo $xmlDoc . $result . "</XMLData>";

echo $xmlDoc . $result . '</XMLData>';

BTW, why the uppercase? Note that XML is case-sensitive.
[...]
Client Side:

function login() {
var username = document.loginForm.username.value;
var password = document.loginForm.password.value;

var username = document.forms["loginForm"].elements["username"].value;
var password = document.forms["loginForm"].elements["password"].value;

Better:

function login(f)
{
var es = f.elements;
if (es)
{
var username = es["username"].value;
var password = es["password"].value;
// ...
return false;
}

return true;
}

<form action="..." onsubmit="return login(this)">
...
<input type="submit" ...>
xmlHttp.onreadystatechange=function() {
if(xmlHttp.readyState==4) {

readyState == 4 does not mean the request was successful; only that the
response has been received completely. Therefore, it should be

if (xmlHttp.readyState==4 && (/^(20)?0$/.test(xmlHttp.status))
{

(Status `0' can occur when this code is applied on file:// URIs.)
var xmlDoc = xmlHttp.responseXML.documentElement; <---- CULPRIT
Works fine in IE, get a 'xmlHttp.responseXML is null' error in FF 3

Your inline comments suck.

Anyhow, WFM in Fx 3.0.1 on WinXP SP3. It did not work here at first because
in PHP I made the typo

header('Content-Type', 'text/xml');

when it must be

header('Content-Type: text/xml');

Also, note that PHP's header() function must be called before any other
output is sent or the call will be silently ignored. Call
error_reporting(E_ALL); in PHP before the header() call to see possible
warnings about that.
if (xmlDoc.getElementsByTagName("login")
[0].childNodes[0].nodeValue == "true") {

textContent or XPath strikes me as being more efficient and less error-prone
here:

if (xmlDoc.getElementsByTagName("login")[0].textContent === "true")

or

if (xmlDoc.evaluate('//login/text()="true"', xmlDoc, null, 0, null)
.booleanValue)

But using JSON instead of XML would probably be even more efficient and
compatible: said:
window.location="main.php"; <---- THIS IS NOT WORKING IN IE
THOUGH, no error console though.....

[...]
}
}
}
xmlHttp.overrideMimeType("text/xml"); <-- TRIED WITH AND WITHOUT
THIS IN FF, SAME PROBLEM

WFM if PHP's header() was not called but XHR's overrideMimeType() was.
xmlHttp.open("GET","app/verifyLogin.php?un=" + escape(username) +
"&pw=" + escape(password),true);

Prefer encodeURIComponent() over escape(). The latter is obsolete and
insufficient, use it only as a fallback.
xmlHttp.send(null);
}

Output on Direct Call to Server:

<XMLData>
<login>true</login>
</XMLData>

And if I do a 'View Source' on that Output:

<?xml version='1.0' encoding='UTF-8'?><XMLData><login>true</login></
XMLData>

Neither does mean the media type declaration was correct, though.
Try e.g. "View Page Info" or LiveHTTPHeaders to be sure:
<https://addons.mozilla.org/addon/3829>


PointedEars
 
K

KDawg44

KDawg44 wrot:
KDawg44 wrote:
My responseXML is always null on my AJAX call.  When I browse directly
to the PHP script I am calling, the XML file shows up just fine.
What is the Content-Type header of the response? It should be "text/xml"
and the document should validate as valid XML.
[...]
The content type is text/xml.

*Are* *you* *really* *really* *sure*? [psf 1.1]

See below.

Note: The "document tree" that was meant here is the automagically indented
syntax-highlighted source code in Gecko-based UAs.  If it is only plaintext
there, the Content-Type header of the response does not fit.  MSHTML ignores
the Content-Type header and *always* displays the document tree (as it
regards it XML) if it sees ` said:
Also, it works perfect in IE 7 but is not working in firefox
(which is  disheartening and confusing...  I am used to that being
the other way around....  :)  ).
[...]
[...]
PHP Script on Server Side
<?php
   header('Content-Type: text/xml');

You should use spaces for indentation (at least when posting your code),
not tabs.  And you should include the encoding declaration as well.
[...]
   $xmlDoc = "<?xml version='1.0' encoding='UTF-8'?><XMLData>";

Since there is nothing to expand for PHP here, it should be the other way
around:

  $xmlDoc = ' said:
   $result = verifyLogin($username, $pw);
   echo $xmlDoc . $result . "</XMLData>";

  echo $xmlDoc . $result . '</XMLData>';

BTW, why the uppercase?  Note that XML is case-sensitive.
[...]
Client Side:
   function login() {
           var username = document.loginForm.username.value;
           var password = document.loginForm.password.value;

    var username = document.forms["loginForm"].elements["username"]..value;
    var password = document.forms["loginForm"].elements["password"]..value;

Better:

  function login(f)
  {
    var es = f.elements;
    if (es)
    {
      var username = es["username"].value;
      var password = es["password"].value;
      // ...
      return false;
    }

    return true;
  }

  <form action="..." onsubmit="return login(this)">
    ...
    <input type="submit" ...>
  said:
           xmlHttp.onreadystatechange=function() {
                   if(xmlHttp.readyState==4) {

readyState == 4 does not mean the request was successful; only that the
response has been received completely.  Therefore, it should be

  if (xmlHttp.readyState==4 && (/^(20)?0$/.test(xmlHttp.status))
  {

(Status `0' can occur when this code is applied on file:// URIs.)
                           var xmlDoc = xmlHttp.responseXML.documentElement;  <---- CULPRIT
Works fine in IE, get a 'xmlHttp.responseXML is null' error in FF 3

Your inline comments suck.

Anyhow, WFM in Fx 3.0.1 on WinXP SP3.  It did not work here at first because
in PHP I made the typo

  header('Content-Type', 'text/xml');

when it must be

  header('Content-Type: text/xml');

Also, note that PHP's header() function must be called before any other
output is sent or the call will be silently ignored.  Call
error_reporting(E_ALL); in PHP before the header() call to see possible
warnings about that.
                           if (xmlDoc.getElementsByTagName("login")
[0].childNodes[0].nodeValue == "true") {

textContent or XPath strikes me as being more efficient and less error-prone
here:

  if (xmlDoc.getElementsByTagName("login")[0].textContent === "true")

or

  if (xmlDoc.evaluate('//login/text()="true"', xmlDoc, null, 0, null)
      .booleanValue)

But using JSON instead of XML would probably be even more efficient and
compatible: said:
                                   window.location="main.php";    <---- THIS IS NOT WORKING IN IE
THOUGH, no error console though.....

[...]
                           }
                   }
           }
           xmlHttp.overrideMimeType("text/xml");  <-- TRIED WITH AND WITHOUT
THIS IN FF, SAME PROBLEM

WFM if PHP's header() was not called but XHR's overrideMimeType() was.
           xmlHttp.open("GET","app/verifyLogin.php?un=" +escape(username) +
"&pw=" + escape(password),true);

Prefer encodeURIComponent() over escape().  The latter is obsolete and
insufficient, use it only as a fallback.
           xmlHttp.send(null);
   }
Output on Direct Call to Server:

And if I do a 'View Source' on that Output:
<?xml version='1.0' encoding='UTF-8'?><XMLData><login>true</login></
XMLData>

Neither does mean the media type declaration was correct, though.
Try e.g. "View Page Info" or LiveHTTPHeaders to be sure:
<https://addons.mozilla.org/addon/3829>

PointedEars
--
Anyone who slaps a 'this page is best viewed with Browser X' label on
a Web page appears to be yearning for the bad old days, before the Web,
when you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee

Thanks for your suggestions. You make a lot of very good points.

This is suddenly working and I think I figured out why. I am
utilizing Dreamweaver so that I can (hopefully) quickly get the HTML
stuff up (though one would argue that since i think this is what
caused my problem that it definitely did not save time...). When I
slapped a few text boxes on the page, it added a form element. I
think this when the button was pushed that called the script to
execute the AJAX call, it also reloaded the page due to an empty
ACTION attribute on the FORM tag.

Now that I have removed the FORM tag, it appears to be working (well
getting as far as my next problem with my PHP SESSION var... but
that's another story...)

Thanks!

Kevin
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top