我有一个 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/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
//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
有没有一种简单的方法可以判断ruby脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过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
我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby2exe项目可以编译在Windows上运行的ruby脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://
我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o