所以我使用PHP + MySQL将XML中的数据库内容传递给JavaScript。
$xml = "<?xml version='1.0' encoding='utf-8'?><confessions><pending>";
$pending = $m->MySqlHandler->Query("SELECT id, gender, age, confession, date_posted FROM confessions WHERE publish = 0");
foreach ($pending->Rows as $pr)
{
list($id, $gender, $age, $confession, $dateposted) = array(
$pr->Columns["id"]->Value,
$pr->Columns["gender"]->Value,
$pr->Columns["age"]->Value,
$pr->Columns["confession"]->Value,
$pr->Columns["date_posted"]->Value
);
$xml .= "<confession id='$id' gender='$gender' age='$age' dateposted='$dateposted'>$confession</confession>";
}
$xml .= "</pending>";
$xml .= "<active>";
$active = $m->MySqlHandler->Query(
"SELECT DISTINCT confessions.*,
(SELECT COUNT(*) FROM comments WHERE confession_id = confessions.id) AS comments,
(SELECT COUNT(*) FROM sentences WHERE confession_id = confessions.id) AS sentences
FROM confessions WHERE confessions.publish = 1"
);
foreach ($active->Rows as $ar)
{
list($id, $gender, $age, $confession, $dateposted, $absolutions) = array(
$ar->Columns["id"]->Value,
$ar->Columns["gender"]->Value,
$ar->Columns["age"]->Value,
$ar->Columns["confession"]->Value,
$ar->Columns["dateposted"]->Value,
$ar->Columns["absolutions"]->Value
);
$sql_template = "SELECT COUNT(*) FROM sentences WHERE confession_id = $id AND degree = '%s'";
$sentence_data = array(
"t" => mysql_result(mysql_query(sprintf($sql_template, "t")), 0, 0),
"c" => mysql_result(mysql_query(sprintf($sql_template, "c")), 0, 0),
"p" => mysql_result(mysql_query(sprintf($sql_template, "p")), 0, 0),
"l" => mysql_result(mysql_query(sprintf($sql_template, "l")), 0, 0)
);
$xml .= "<confession absolutions='$absolutions' t='{$sentence_data['t']}' "
. "c='{$sentence_data['c']}' p='{$sentence_data['p']}' "
. "l='{$sentence_data['l']}' id='$id' gender='$gender' "
. "age='$age'>$confession</confession>";
}
$xml .= "";
header("Content-Type: application/xml");
echo $xml;
所以,从那里,你得到的结果如......
<?xml version='1.0' encoding='utf-8'?>
<confessions>
<pending>
<confession id="1" gender="m" age="20" dateposted="2010-02-06 05:22:57">
Confesando.
</confession>
</pending>
<active>
<confession absolutions="0" t="0" c="0" p="0" l="0" id="2" gender="m" age="18">
Confesion.
</confession>
</active>
</confessions>
我使用以下代码加载XML:
function sendData(params, to, oncomplete)
{
if (typeof oncomplete == 'undefined')
{
oncomplete = function() {};
}
if (typeof window.ActiveXObject != 'undefined' ) {
http = new ActiveXObject("Microsoft.XMLHTTP");
http.onreadystatechange = oncomplete;
} else {
http = new XMLHttpRequest();
http.onload = oncomplete;
}
http.open("POST", to, false);
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-Length", params.length);
http.setRequestHeader("Connection", "close");
http.send(params);
}
......就像这样叫:
// Load approval-pending data //
sendData("", "./leer/confesiones/" + sId, function()
{
var xml = http.responseXML;
var pending = xml.getElementsByTagName("pending").getElementsByTagName("confession");
(...)
我会在这里停下来。因为当我尝试解析XML时,我在Firebug中收到以下错误:
XML Parsing Error: no element found Location: moz-nullprincipal:{7e9eab45-2f73-476d-9bdb-2370d1534f29} Line Number 1, Column 1:
^
我尝试通过将其作为URL输入到浏览器来加载./leer/confesiones/
,它就像一个魅力。完全有效的XML。使用Firebug在“Net”下检查XHR也是如此,有效的XML。 Console视图是一个给我错误的视图,就像它是一个JavaScript错误一样。但http.responseText
包含文字中的XML,xml
的类型为[object XMLDocument]
。
那么......我错过了什么?
已解决:修改PHP以输出JSON和JavaScript以正确解析它。
答案 0 :(得分:4)
帮自己一个忙,并使用一个包含所有ajax魔法的JS库。有很多跨浏览器的问题和陷阱,这可能只是其中之一。
我推荐jQuery,它是最简单,功能最强大的。 所以将它添加到html的顶部,在head标签内:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
然后在你的JS做这样的事情:
$.get('/leer/confesiones/', function(data) {
console.log(data);
});
这应该让你开始。 Look here了解有关jQuery和$ .get函数的更多信息。 顺便说一句 - 我看到你正在使用POST,但是为了检索数据(没有更新或删除),约定是GET。
此外,请考虑更改PHP,以便返回JSON格式的数据而不是XML。 因此,与xml标记不同,不要做那个小小的舞蹈,只需准备一个包含所有数据的数组,然后执行此操作:
echo json_encode($array); // voila
答案 1 :(得分:1)
if (typeof window.ActiveXObject != 'undefined' ) {
我首先要使用原生XMLHttpRequest。 ActiveXObject应该只是一个后备,因为它可能会生成丑陋的ActiveX警告。
http = new ActiveXObject("Microsoft.XMLHTTP");
意外全球化。记住使用var
。
http.onreadystatechange = oncomplete;
在更多情况下调用 onreadystatechange
而不仅仅是完成。您应该只在oncomplete
触发readystatechange
时调用readyState===4
,否则您可能会尝试解析不完整或缺失的XML。
http.onload = oncomplete;
onload
不是XMLHttpRequest标准的一部分。您应该对两个分支使用onreadystatechange
。
答案 2 :(得分:1)
如果JQuery解决了这个特定的问题,我有点惊讶...至少,你可以生成相同的错误: XMLHttpRequest xml response woes with jQuery 1.4.1, how to force the request response to be processed as plain text?
在我的情况下,至少,这完全是由于我正在制作跨域请求,并且关于它的XML错误是“不可解析的”只是因为没有XML回来这一事实的副作用(因为浏览器不允许)。
答案 3 :(得分:0)
我不知道PHP,但是我看不到你在哪里得到<confession>
元素的结束标记。让我感到困惑,因为你说输出结构良好......