【问题标题】:Unable to read Javascript responseXML from PHP无法从 PHP 读取 Javascript responseXML
【发布时间】:2023-03-16 03:35:01
【问题描述】:

我有一个运输区域数据库,我想使用 PHP 通过 AJAX 请求访问该数据库。

PHP 没有为 responseXML 正确生成 XML。如果我将我的 url 更改为 .xml 文件,那么脚本就可以工作。

这是我生成 XML 的 PHP `

<?
    libxml_use_internal_errors(true);
    $country_id = intval($_GET['country']);
    $country_id = 74;
    $con = mysqli_connect("localhost", "tradingb_data", "[s;_m@NN2;)F", 'tradingb_tradingbloc');
    if (!$con) {
        die('Could not connect: ' . mysqli_error($con));
    }

    mysqli_select_db($con,"ajax_demo");
    $sql="SELECT * FROM `shipping_zones` WHERE zone_type = 'Province' and parent_zone = '$country_id' ORDER BY zone";
    $result = mysqli_query($con,$sql);

    echo "<?xml version=\"1.0\" ?> <shipping_zones>";
    while($row = mysqli_fetch_array($result)) {
        $row_id = $row['id'];
        $row_zone = $row['zone'];
        echo "<province> <zoneid>$row_id</zoneid><zone>$row_zone</zone></province>";
    }
    echo "</shipping_zones>";

    mysqli_close($con);
?>

`

这是我的 Javascript `

function changeCountry(){
                var e = document.getElementById(\"country_id\");
                var country_id = e.options[e.selectedIndex].value;
                if(country_id == 1){
                    // Display states
                        document.getElementById('display_province').style.display = \"none\";
                    document.getElementById('display_state').style.display =     \"\";
                        document.getElementById('display_state').style.visibility = \"visible\";
                }
                else{
                    // Display Province
                    document.getElementById('display_state').style.display =     \"none\";
                        document.getElementById('display_province').style.display = \"\";
                    document.getElementById('display_province').style.visibility = \"visible\";
                    // Remove current selection list 


                    // Get Provinces for country_id
                    var xmlhttp = new XMLHttpRequest();
                    // Include fix for IE6 and IE5
                    if (window.XMLHttpRequest) {
                        // code for IE7+, Firefox, Chrome, Opera, Safari
                        xmlhttp = new XMLHttpRequest();
                    } else {
                        // code for IE6, IE5
                        xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");
                    }
                    xmlhttp.onreadystatechange = function() {
                        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                            var xmlDoc = xmlhttp.responseXML;
                            // get each property 
                            // Last known execution
                            var x=xmlDoc.getElementsByTagName(\"province\");
                            for (i=0;i<x.length;i++)
                            { 
                                var e = document.getElementById(\"province_id\");
                                var opt = document.createElement('option');
                                opt.value = x[i].getElementsByTagName('zoneid')[0];
                                opt.innerHTML = x[i].getElementsByTagName('zone')[0];
                                e.appendChild(opt);
                            }
                        }
                    }
                    xmlhttp.open(\"GET\",\"get_provinces.php?country_id=\"+country_id,true);
                    xmlhttp.setRequestHeader(\"Content-type\", \"text/xml\");
                    xmlhttp.send();
                }
            }

`

我知道我的错误在于 PHP 为 AJAX 请求生成的内容。

【问题讨论】:

    标签: javascript php ajax xml


    【解决方案1】:
    xmlhttp.onreadystatechange = function() {
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    
        var xmlDoc = xmlhttp.responseXML;
        // get each property 
        // Last known execution
        var x = xmlDoc.getElementsByTagName('province');
        for (i = 0; i < x.length; i++) {
    
          var e = document.getElementById('province_id');
          var opt = document.createElement('option');
          opt.value = x[i].getElementsByTagName('zoneid')[0].textContent;
          opt.innerHTML = x[i].getElementsByTagName('zone')[0].textContent;
          e.appendChild(opt);
        }
      }
    }
    

    我做了一个plunker并测试它。

    将 \" 替换为 ' 并使用 .textContent

    http://plnkr.co/edit/fddv9rYpCcbz4zt1D9Sb?p=preview

    (抱歉之前误导了你)

    【讨论】:

    • 谢谢!我刚刚确认这是我自己的 PHP 文件的 xml 输出,并且您的 plunker 也确认了它。我将查看我的 get_provinces.php 以确定响应 XML 命令未正确解析它的原因。
    • 但你看到我使用输出作为 Province.xml 文件你所说的 get_provinces.php 输出。 changeCountry() 是一个 javascript 函数,所以不要使用转义符 \" ,使用普通的 " 或 '
    • 我用xmlhttp.open(\"GET\",\"provinces.xml\"); 替换了xmlhttp.open(\"GET\",\"get_provinces.php?country_id=\"+country_id,true);,它工作正常。这意味着 PHP 文件 get_provinces.php 没有创建 Javascript 可以解释的输出。虽然这解决了我的迫切需求,但我将继续为 PHP 文件解决问题。感谢您在寻找解决方案方面的帮助!
    【解决方案2】:

    这是更正后的 PHP 文件。必须设置标头。

    感谢 micha 帮助我解决这个问题!

    `

    <?
        header('Content-Type: text/xml');
        header("Cache-Control: no-cache, must-revalidate");
        libxml_use_internal_errors(true);
        $country_id = intval($_GET['country_id']);
        $con = mysqli_connect("localhost", "tradingb_data", "[s;_m@NN2;)F", 'tradingb_tradingbloc');
        if (!$con) {
            die('Could not connect: ' . mysqli_error($con));
        }
    
        $sql="SELECT * FROM `shipping_zones` WHERE zone_type = 'Province' and parent_zone = '$country_id' ORDER BY zone";
        $result = mysqli_query($con,$sql);
    
        echo "<?xml version='1.0' encoding='UTF-8' ?>
            <shipping_zones>";
        while($row = mysqli_fetch_array($result)) {
            $row_id = $row['id'];
            $row_zone = $row['zone'];
            echo "<province><zoneid>$row_id</zoneid><zone>$row_zone</zone></province>";
        }
        echo "</shipping_zones>";
        mysqli_close($con);
    ?>
    

    `

    【讨论】:

    • micha 更正的 Javascript 是此更正工作所必需的。
    【解决方案3】:

    你在哪里设置xmlDoc?您的浏览器的 javascript 控制台中是否有任何输出?

    【讨论】:

    • 对不起,var xml = xmlhttp.responseXML; s/b var xmlDoc = xmlhttp.responseXML; 我会检查我的控制台,谢谢!
    • 控制台说我的变量中有null。这让我相信我需要在responseXML 读取 XML 之前在 PHP 中对其进行编码?
    • @Dreamwalker 哪一个?您可以尝试加载与您的 php 输出内容相同的静态文件,以检查问题是由 php/xml 还是 javascript 引起的。
    • 控制台显示变量xmlDoc 为空。这是实际的控制台输出Uncaught TypeError: Cannot read property 'getElementsByTagName' of null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2017-04-26
    • 2015-09-05
    • 2015-07-13
    相关资源
    最近更新 更多