3

我有一个 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>

我已经使用 query.php 文件中的真实查询测试了这个脚本,它工作正常。数据从 DB 中检索,形成 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 Internal Server Errror ”。但是,如果我在 Fiddler 中检查消息,正确的 XML 输出实际上是存在的?!?!

为什么服务器与 XML 数据一起返回 500 Internal Server Error?为什么只有当输出太短时才会抛出错误?

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

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

编辑: 来自 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();

?>
4

2 回答 2

1

感谢n.st的建议,我发现了问题!

我查看了服务器日志,发现 PHP 脚本中有一个特定的行引发了错误……一行内容如下:

$mysqli->close();

这条线应该被注释掉(因为最后我求助于使用不推荐使用的'mysql_'函数),但由于某种原因我没有注释它。

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

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

谢谢大家!

于 2013-10-08T19:12:36.080 回答
0

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

在您查询的表中“更远”的行中找到的特殊字符将解释为什么“较短”的响应有效而“较长”的响应不起作用。

于 2013-10-07T23:42:40.713 回答