Ajax 脚本仅在收到的 XML 足够大/需要足够长的时间来加载时才有效


Ajax script only works when the received XML is big enough/takes long enough to load?

我有一个jQuery脚本,它调用一个PHP文件,该文件将查询数据库,然后将结果吐为XML。jQuery脚本获取XML,解析它并将其放入数组中以绘制一些图表。

这是 Ajax 脚本:

<script>
var arr={};    
$(document).ready(function(){
  $.ajax({
    type: "POST",
    url: "http://myserver.com/query.php",
    dataType: "xml",
    success: function(xml) {
        $(xml).find('item').each(function(index,value){
            var data={};
            $(this).find('*').each(function(i,v){
                if(isNaN(parseFloat($(this).text()))) {
                    data[$(this).prop('tagName')]=$(this).text();
                } else {
                    data[$(this).prop('tagName')]=parseFloat($(this).text());
                }
            });
            arr[index]=data;
        })
        DataLoaded();
    }
  });
});
</script>

我已经使用查询.php文件中的真实查询测试了此脚本,并且它工作正常。数据从数据库中检索,被塑造成XML格式并发送回JavaScript,在那里它被正确处理和播放。

现在。。。我在修改查询时发现了最奇怪的问题:如果返回的 XML 太短,ajax 脚本不起作用

与 Ajax 脚本配合良好的 XML 输出的(简化(示例:

<results>
 <item>
  <variable1>value1</variable1>
  <variable2>value2</variable2>
  <variable3>value3</variable3>
 </item>
 <item>
  <variable1>value4</variable1>
  <variable2>value5</variable2>
  <variable3>value6</variable3>
 </item>
 <item>
  <variable1>value7</variable1>
  <variable2>value8</variable2>
  <variable3>value9</variable3>
 </item>
 <item>
  <variable1>value10</variable1>
  <variable2>value11</variable2>
  <variable3>value12</variable3>
 </item>
</results>

不起作用的 XML 输出示例:

<results>
 <item>
  <variable1>value1</variable1>
  <variable2>value2</variable2>
  <variable3>value3</variable3>
 </item>
 <item>
  <variable1>value4</variable1>
  <variable2>value5</variable2>
  <variable3>value6</variable3>
 </item>
</results>

对于最后一种情况,PHP 工作正常(我可以直接从浏览器访问 PHP 文件,我看到如上所示的 XML 输出(,但是如果我在服务器上运行 HTML 文件,它只会永远停滞而不会显示数据。

我使用过Chrome调试工具和Fiddler,并且我看到我的服务器显然返回了">500内部服务器错误"。但是,如果我检查 Fiddler 中的消息,实际上存在正确的 XML 输出?!?!

为什么服务器与 XML 数据一起返回 500 内部服务器错误?为什么它只在输出太短时才抛出错误?

我的意思是,我可以理解它在较长的数据集上有问题......但是较短的??

我在这里完全不知所措...任何帮助将不胜感激!

编辑:来自Fiddler的更多信息。

响应消息之间的唯一区别似乎在标头中。

成功案例:

HTTP/1.1 200 OK
Date: Mon, 07 Oct 2013 21:50:10 GMT
Server: Apache/2.2.12 (Linux/SUSE)
X-Powered-By: PHP/5.2.14
Content-Length: 4627
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/xml

失败案例:

HTTP/1.0 500 Internal Server Error
Date: Mon, 07 Oct 2013 21:21:22 GMT
Server: Apache/2.2.12 (Linux/SUSE)
X-Powered-By: PHP/5.2.14
Content-Length: 371
Connection: close
Content-Type: text/xml

在此之下,两条消息都只包含预期的干净 XML 数据!

更新:

PHP代码:

<?php
$dbhost = 'myserver.com';
$dbuser = 'login';
$dbpass = 'password';
$dbname = 'DB';

$link = mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error"); 
mysql_select_db($dbname, $link) or die("DB error");

$sql = "select bla bla bla... working query here";
$result = mysql_query($sql);
function mysql_XML($result, $docName='results', $itemName='item') {
   $field = array();
   for ($i=0; $i<mysql_num_fields($result); $i++)
      $field[$i] = mysql_field_name($result, $i);
   // XML document
   $dom = new DOMDocument('1.0', 'UTF-8');
   $doc = $dom->appendChild($dom->createElement($docName));
   for ($i=0; $i<mysql_num_rows($result); $i++) {
      $node = $doc->appendChild($dom->createElement($itemName));
      for ($b=0; $b<count($field); $b++) {
         $textField = $node->appendChild($dom->createElement($field[$b]));
         $textField->appendChild($dom->createTextNode(mysql_result($result, $i, $b)));
      }
   }
   // returning XML as text
   $dom->formatOutput = true; 
   return $dom->saveXML();    
}
header ('Content-type: text/xml');
echo mysql_XML($result);
$mysql_close();
?>

多亏 n.st 建议,我发现了问题!

我查看了服务器日志,发现 PHP 脚本中有一行特定行为抛出错误......其中一行内容如下:

$mysqli->close();

这一行应该被注释掉(因为最终我使用了已弃用的"mysql_"函数(,但由于某种原因,我没有注释它。

无论如何。。。即使这是一个PHP错误,PHP本身在直接从浏览器访问时也不会抛出任何错误。此外,这仅在查询足够短(足够短,可能为 10 秒长(时导致"500 内部服务器错误"响应,而对于比这更长的查询,我在浏览器中没有看到任何错误!

也许对于更长的查询,当实际 XML 到达时,500 错误在某种程度上已经"过期"了??我真的不知道...但是,如果你们中的任何人遇到 500 错误,请记住:检查 PHP 代码中是否有任何错误!即使浏览器中的非错误也可能成为 AJAX 事务中的错误。

谢谢大家!

例如,

数据库中的条目可能包含 DOMDocument 不喜欢&rsquo;字符。自从我使用 php XML 库以来已经有一段时间了,但我很确定当您尝试使用未由 XML 定义的 HTML 特殊字符时,它们会抛出错误。检查数据库中是否存在 html 特殊字符的实例。类似于 select * from some_table where some_column like '%&%;'; 的内容应该返回可能的 html 特殊字符。

在您查询的表中"更远"的行中找到一个特殊字符可以解释为什么"较短"的响应有效,而"较长"的响应不起作用。