AJAX Help - responseXML always NULL

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • KDawg44

    AJAX Help - responseXML always NULL

    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>malts y</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
  • Thomas 'PointedEars' Lahn

    #2
    Re: AJAX Help - responseXML always NULL

    KDawg44 wrote:
    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
    --
    Use any version of Microsoft Frontpage to create your site.
    (This won't prevent people from viewing your source, but no one
    will want to steal it.)
    -- from <http://www.vortex-webdesign.com/help/hidesource.htm>

    Comment

    • Peter Michaux

      #3
      Re: AJAX Help - responseXML always NULL

      KDawg44 wrote:
      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.

      --
      Peter

      Comment

      • KDawg44

        #4
        Re: AJAX Help - responseXML always NULL

        On Aug 2, 6:12 pm, Peter Michaux <petermich...@g mail.comwrote:
        KDawg44 wrote:
        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.
        >
        --
        Peter
        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

        Comment

        • KDawg44

          #5
          Re: AJAX Help - responseXML always NULL

          On Aug 2, 6:23 pm, KDawg44 <KDaw...@gmail. comwrote:
          On Aug 2, 6:12 pm, Peter Michaux <petermich...@g mail.comwrote:
          >
          KDawg44 wrote:
          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.
          >
          --
          Peter
          >
          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($us ername, $pw);
          echo $xmlDoc . $result . "</XMLData>";

          .... SOME MORE CUT ....


          Client Side:

          function login() {
          var username = document.loginF orm.username.va lue;
          var password = document.loginF orm.password.va lue;
          xmlHttp.onready statechange=fun ction() {
          if(xmlHttp.read yState==4) {
          var xmlDoc = xmlHttp.respons eXML.documentEl ement; <---- CULPRIT
          Works fine in IE, get a 'xmlHttp.respon seXML is null' error in FF 3
          if (xmlDoc.getElem entsByTagName(" login")
          [0].childNodes[0].nodeValue == "true") {
          window.location ="main.php"; <---- THIS IS NOT WORKING IN IE
          THOUGH, no error console though.....
          } else {
          document.getEle mentByID("login Error").innerHT ML =
          "<center>Invali d Username and/or Password</center>"; <--- THIS ISN'T
          WORKING IN IE EITHER.....
          }
          }
          }
          xmlHttp.overrid eMimeType("text/xml"); <-- TRIED WITH AND WITHOUT
          THIS IN FF, SAME PROBLEM
          xmlHttp.open("G ET","app/verifyLogin.php ?un=" + escape(username ) +
          "&pw=" + escape(password ),true);
          xmlHttp.send(nu ll);
          }


          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><l ogin>true</login></
          XMLData>




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

          Thank you very much for any help.

          Kevin

          Comment

          • Thomas 'PointedEars' Lahn

            #6
            Re: AJAX Help - responseXML always NULL

            KDawg44 wrot:
            On Aug 2, 6:23 pm, KDawg44 <KDaw...@gmail. comwrote:
            >On Aug 2, 6:12 pm, Peter Michaux <petermich...@g mail.comwrote:
            >>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.
            >THe document tree shows up perfect when I browse to the PHP file.
            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 `<?xml ...?>' and no `<html'.
            >Also, it works perfect in IE 7 but is not working in firefox
            <http://www.jibbering.c om/faq/faq_notes/clj_posts.html# ps1DontWork>
            >(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 = '<?xml version="1.0" encoding="UTF-8"?><XMLData >';
            $result = verifyLogin($us ername, $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.loginF orm.username.va lue;
            var password = document.loginF orm.password.va lue;
            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="retur n login(this)">
            ...
            <input type="submit" ...>
            </form>
            xmlHttp.onready statechange=fun ction() {
            if(xmlHttp.read yState==4) {
            readyState == 4 does not mean the request was successful; only that the
            response has been received completely. Therefore, it should be

            if (xmlHttp.readyS tate==4 && (/^(20)?0$/.test(xmlHttp.s tatus))
            {

            (Status `0' can occur when this code is applied on file:// URIs.)
            var xmlDoc = xmlHttp.respons eXML.documentEl ement; <---- CULPRIT
            Works fine in IE, get a 'xmlHttp.respon seXML 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.getElem entsByTagName(" login")
            [0].childNodes[0].nodeValue == "true") {
            textContent or XPath strikes me as being more efficient and less error-prone
            here:

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

            or

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

            But using JSON instead of XML would probably be even more efficient and
            compatible: <http://json.org/>
            window.location ="main.php"; <---- THIS IS NOT WORKING IN IE
            THOUGH, no error console though.....
            <http://jibbering.com/faq/#FAQ4_43>
            [...]
            }
            }
            }
            xmlHttp.overrid eMimeType("text/xml"); <-- TRIED WITH AND WITHOUT
            THIS IN FF, SAME PROBLEM
            WFM if PHP's header() was not called but XHR's overrideMimeTyp e() was.
            xmlHttp.open("G ET","app/verifyLogin.php ?un=" + escape(username ) +
            "&pw=" + escape(password ),true);
            Prefer encodeURICompon ent() over escape(). The latter is obsolete and
            insufficient, use it only as a fallback.
            xmlHttp.send(nu ll);
            }
            >
            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><l ogin>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

            Comment

            • KDawg44

              #7
              Re: AJAX Help - responseXML always NULL

              On Aug 3, 8:57 am, Thomas 'PointedEars' Lahn <PointedE...@we b.de>
              wrote:
              KDawg44 wrot:
              >
              On Aug 2, 6:23 pm, KDawg44 <KDaw...@gmail. comwrote:
              On Aug 2, 6:12 pm, Peter Michaux <petermich...@g mail.comwrote:
              >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.
              >
              THe document tree shows up perfect when I browse to the PHP file.
              >
              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 `<?xml ...?>' and no `<html'.
              >
              Also, it works perfect in IE 7 but is not working in firefox
              >
              <http://www.jibbering.c om/faq/faq_notes/clj_posts.html# ps1DontWork>
              >
              (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 = '<?xml version="1.0" encoding="UTF-8"?><XMLData >';
              >
                 $result = verifyLogin($us ername, $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.loginF orm.username.va lue;
                         var password = document.loginF orm.password.va lue;
              >
                  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="retur n login(this)">
                  ...
                  <input type="submit" ...>
                </form>
              >
                         xmlHttp.onready statechange=fun ction() {
                                 if(xmlHttp.read yState==4) {
              >
              readyState == 4 does not mean the request was successful; only that the
              response has been received completely.  Therefore, it should be
              >
                if (xmlHttp.readyS tate==4 && (/^(20)?0$/.test(xmlHttp.s tatus))
                {
              >
              (Status `0' can occur when this code is applied on file:// URIs.)
              >
                                         var xmlDoc = xmlHttp.respons eXML.documentEl ement;  <---- CULPRIT
              Works fine in IE, get a 'xmlHttp.respon seXML 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.getElem entsByTagName(" login")
              [0].childNodes[0].nodeValue == "true") {
              >
              textContent or XPath strikes me as being more efficient and less error-prone
              here:
              >
                if (xmlDoc.getElem entsByTagName(" login")[0].textContent === "true")
              >
              or
              >
                if (xmlDoc.evaluat e('//login/text()="true"', xmlDoc, null, 0, null)
                    .booleanValue)
              >
              But using JSON instead of XML would probably be even more efficient and
              compatible: <http://json.org/>
              >
                                                 window.location ="main.php";    <---- THIS IS NOT WORKING IN IE
              THOUGH, no error console though.....
              >
              <http://jibbering.com/faq/#FAQ4_43>
              >
              [...]
                                         }
                                 }
                         }
                         xmlHttp.overrid eMimeType("text/xml");  <-- TRIED WITH AND WITHOUT
              THIS IN FF, SAME PROBLEM
              >
              WFM if PHP's header() was not called but XHR's overrideMimeTyp e() was.
              >
                         xmlHttp.open("G ET","app/verifyLogin.php ?un=" +escape(usernam e) +
              "&pw=" + escape(password ),true);
              >
              Prefer encodeURICompon ent() over escape().  The latter is obsolete and
              insufficient, use it only as a fallback.
              >
                         xmlHttp.send(nu ll);
                 }
              >
              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><l ogin>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

              Comment

              Working...