草庐IT

javascript - Ajax 脚本仅在接收到的 XML 足够大/加载时间足够长时才起作用?

coder 2024-07-02 原文

我有一个 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,在 JavaScript 中正确处理和播放数据。

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

一个(简化的)XML 输出示例,可以很好地与 Ajax 脚本配合使用:

<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 输出实际上在那里?!?!

为什么服务器返回 500 Internal Server Error 和 XML 数据?为什么它只在输出太短时抛出错误??

我的意思是,我可以理解它在处理较长的数据集时遇到问题...但处理较短的数据集时会遇到问题??

我在这里完全不知所措......非常感谢任何帮助!

编辑: 来自 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 内部服务器错误”响应,而对于比这更长的查询,我在浏览器中看不到任何错误!

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

感谢大家!

关于javascript - Ajax 脚本仅在接收到的 XML 足够大/加载时间足够长时才起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235380/

有关javascript - Ajax 脚本仅在接收到的 XML 足够大/加载时间足够长时才起作用?的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  5. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  6. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  7. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

  8. jquery - 如何将 AJAX 变量从 jQuery 传递到他们的 Controller ? - 2

    我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam

  9. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby-on-rails - "assigns"在 Ruby on Rails 中有什么作用? - 2

    我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o

随机推荐