Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax脚本仅在接收的XML足够大/加载所需时间足够长时才起作用?_Javascript_Php_Jquery_Xml_Ajax - Fatal编程技术网

Javascript Ajax脚本仅在接收的XML足够大/加载所需时间足够长时才起作用?

Javascript Ajax脚本仅在接收的XML足够大/加载所需时间足够长时才起作用?,javascript,php,jquery,xml,ajax,Javascript,Php,Jquery,Xml,Ajax,我有一个jQuery脚本,它调用一个PHP文件来查询数据库,然后将结果转换为XML。jQuery脚本获取XML,解析它并将其放入数组中以绘制一些图表 这是Ajax脚本: <script> var arr={}; $(document).ready(function(){ $.ajax({ type: "POST", url: "http://myserver.com/query.php", dataType: "xml", succe

我有一个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>
<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>
故障案例:

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

$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();

?>
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();

?>

数据库中的条目可能包含DOMDocument不喜欢的字符例如。我已经有一段时间没有使用PHPXML库了,但是我很确定当您尝试使用XML未定义的HTML特殊字符时,它们会抛出一个错误。检查数据库中的html特殊字符实例。类似于
从某个_表中选择*,其中某个_列如“%&%”应返回可能的html特殊字符


在您查询的表的“较低”行中发现一个特殊字符,可以解释为什么“较短”的响应有效,而“较长”的响应无效。

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

我查看了服务器日志,发现PHP脚本中有一行抛出错误。。。其中一行是:

$mysqli->close();
这一行应该被注释掉(因为最后我使用了不推荐使用的'mysql_'函数),但出于某种原因,我没有注释它

无论如何。。。尽管这是一个PHP错误,但当直接从浏览器访问时,PHP本身并没有抛出任何错误。而且,这只会在查询足够短时(短到可能需要10秒才能运行)导致“500 Internal Server Error”(500 Internal Server Error)响应,而对于超过此长度的查询,我在浏览器中看不到任何错误

也许对于较长的查询,500错误在实际XML到达时已经“过期”了??我真的不知道。。。但是,如果你们中的任何人面临500个错误,请记住:检查PHP代码中的任何错误!甚至浏览器中的非错误也可能成为AJAX事务中的错误


谢谢大家

听起来你的问题出在服务器端。你能给我们看一下PHP代码吗?对我来说,这可能是服务器端PHP的问题,也可能是错误使用异步调用的问题。ie:如果您假设在$.ajax()之后有任何代码;代码将在此之后运行,您做出了错误的假设。@马特:使用上面的PHP代码更新,请看一看。@OddityOverseer:这两个都是长期运行的查询。“长”的可能需要20秒,而“短”的可能需要15秒。我假设如果我有同步问题,它们在这两种情况下都会出现?当服务器返回一个5xx状态代码时,它应该在某个地方记录原因,比如
/var/log/apache2/error.log
--你看了吗?很高兴你解决了它!顺便说一下,你可以接受自己的答案。
$mysqli->close();