我有一个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文件中的真实查询测试了这个脚本,它运行正常。数据从数据库中检索,形成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内部服务器错误?为什么只在输出太短时抛出错误?
我的意思是,我可以理解它有较长数据集的问题......但是更短的那些?
我在这里完全不知所措......任何帮助都会非常感激!
修改 来自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();
?>
答案 0 :(得分:1)
感谢 n.st 建议,我发现了问题!
我查看了服务器日志,发现PHP脚本中有一条特定的行引发了错误......一行显示:
$mysqli->close();
该行应该被注释掉(因为最后我使用了已弃用的'mysql_'函数),但是由于某种原因我没有注释它。
无论如何......即使这是一个PHP错误,PHP本身在从浏览器直接访问时也没有抛出任何错误。此外,当查询足够短(足够短,可能是10秒长时间运行)时,这只会导致“500内部服务器错误”响应,而对于查询时间长于我在浏览器中看不到错误!
对于更长时间的查询,500错误在实际XML到达时有点“过期”?我真的不知道......但如果你们中有任何人遇到500错误,请记住:检查PHP代码中的任何错误!即使浏览器中的非错误也可能成为AJAX事务中的错误。
感谢所有人!
答案 1 :(得分:0)
例如,数据库中的条目可能包含DOMDocument不喜欢的字符’
。我已经使用了php XML库已经有一段时间了,但是我很确定当你尝试使用XML没有定义的HTML特殊字符时它们会抛出一个错误。检查数据库中是否有html特殊字符的实例。像select * from some_table where some_column like '%&%;';
这样的东西应该返回可能的html特殊字符。
在您查询的表格中“更远”的行中找到一个特殊字符,可以解释为什么“较短”的响应在“较长”响应时不起作用。