我在這裏看到類似主題的各種帖子。不幸的是這些都沒有幫助。從jQuery Ajax php調用返回XML?
我對ajax調用了一個php文件,該文件創建了一個XML文件,我從其中填充適當的表單字段,前提是找到了數據。
如果我指定返回數據爲XML,如下所示,我沒有得到成功,並顯示警告「無法檢索XML文件」。
function check_Address(){
alert("username=" + $("#username").attr("value"));
$.ajax({
type: "POST",
url: "admin_Check_Address.php",
data: "username=" + $("#username").attr("value"),
dataType: "xml",
success: function(return_Data){
set_Address(return_Data);
},
error: function(return_Data){
alert("Could not retrieve XML file.");
}
}); // end ajax call
}
但是,如果我刪除的數據類型我獲得成功的功能SET_ADDRESS被付諸行動,並在return_Data的標記名被發現場已正確安裝。即
function check_Address(){
alert("username=" + $("#username").attr("value"));
$.ajax({
type: "POST",
url: "admin_Check_Address.php",
data: "username=" + $("#username").attr("value"),
success: function(return_Data){
set_Address(return_Data);
},
error: function(return_Data){
alert("Could not retrieve XML file.");
}
}); // end ajax call
}
這裏是PHP:
<?php
/*
* Accept username from Ajax
* Get appropriate key
* Check for pre existing address(es)
*/
if(isset($_POST["username"])){
// retrieve user key
$sql = "SELECT * FROM User ";
$sql .= "WHERE username = ";
$sql .= "'";
$sql .= $_POST['username'];
$sql .= "'";
$sql .= " LIMIT 1;";
$user = User::find_By_Sql($sql);
$user_Key = $user[0]->get_User_Key();
// check for an existing address or addresses
$sql = "SELECT * FROM Address ";
$sql .= "WHERE user_Key = ";
$sql .= "'";
$sql .= $user_Key;
$sql .= "';";
$addresses = Address::find_By_Sql($sql);
// how many addresses found
// if none nothing to do except set focus on address 1
// if 1 address returned check active and return xml to complete fields
// if >1 return xml to create list for user to select from
echo "addr ct:" . count($addresses);
if (count($addresses) == 1){
construct_XML($addresses[0]);
}
} else {
echo "error nothing passed";
}
function construct_XML($address){
echo ("start xml");
$xml_String = "<?xml vesrion=\"1.0\"?>";
$xml_String .= "<addresses>";
$xml_String .= "<address>";
$xml_String .= "<username>";
$xml_String .= $_POST['username'];
$xml_String .= "</username>";
$xml_String .= "<address1>";
$xml_String .= $address->address_1;
$xml_String .= "</address1>";
$xml_String .= "<address2>";
$xml_String .= $address->address_2;
$xml_String .= "</address2>";
$xml_String .= "<city>";
$xml_String .= $address->city;
$xml_String .= "</city>";
$xml_String .= "<county>";
$xml_String .= $address->county;
$xml_String .= "</county>";
$xml_String .= "<country>";
$xml_String .= $address->country;
$xml_String .= "</country>";
$xml_String .= "<post_Code>";
$xml_String .= $address->post_Code;
$xml_String .= "</post_Code>";
$xml_String .= "</address>";
$xml_String .= "</addresses>";
echo $xml_String;
}
?>
設定的地址功能,讀取XML是:
function set_Address(return_Data){
$("#address_1").attr("value", $("address1", return_Data).text());
$("#address_2").attr("value", $("address2", return_Data).text());
$("#city").attr("value", $("city", return_Data).text());
$("#county").attr("value", $("county", return_Data).text());
$("#country").attr("value", $("country", return_Data).text());
$("#code").attr("value", $("post_Code", return_Data).text());
}
我在想,我應該返回的文件。 XML而不是回聲字符串,但我不知道如何做到這一點。
任何想法我錯了嗎?我可以簡單地省略數據類型,它一切正常,但我想知道爲什麼它不會識別這個XML,所以我明白了下一次。
非常感謝。
好多謝謝你的回覆。是的,我在原帖中留下了兩個錯誤,它迴應了2條不想要的行。
我現在明白我需要在字符串之前包含頭部,以便讓ajax以XML的形式接受此事。
header ("Content-Type:text/xml");
但是我還是不能讓jQuery來正確地解析從PHP返回的數據都遇到過:
XML解析錯誤沒有的元素中找到位置MOZ-nullprincipal
我一直無法解決這個問題。因此我更新了ajax,以便在另一個套接字中獲取PHP返回XML。我不知道是這是適當的,但它的工作原理:.....
這裏是PHP
<?php require_once("../../_includes/initialize.php"); ?>
<?php
/*
* Accept username from Ajax
* Get appropriate key
* Check for pre existing address(es)
*/
$tmpuser = "[email protected]";
if(isset($_POST["username"])){
// retrieve user key
$sql = "SELECT * FROM User ";
$sql .= "WHERE username = ";
$sql .= "'";
$sql .= $_POST['username'];
$sql .= "'";
$sql .= " LIMIT 1;";
$user = User::find_By_Sql($sql);
$user_Key = $user[0]->get_User_Key();
// check for an existing address or addresses
$sql = "SELECT * FROM Address ";
$sql .= "WHERE user_Key = ";
$sql .= "'";
$sql .= $user_Key;
$sql .= "';";
$addresses = Address::find_By_Sql($sql);
// how many addresses found
// if none nothing to do except set focus on address 1
// if 1 address returned check active and return xml to complete fields
// if >1 return xml to create list for user to select from
if (count($addresses) == 1){
construct_XML($addresses[0]);
}
} else {
//"error nothing passed";
}
function construct_XML($address){
// initialize xml object
$xml_Data = simplexml_load_string("<?xml version='1.0'?>\n<addresses></addresses>");
$address_Detail = $xml_Data->addChild("address");
$address_Detail->addChild("username", $_POST['username']);
$address_Detail->addChild("address1", $address->address_1);
$address_Detail->addChild("address2", $address->address_2);
$address_Detail->addChild("city", $address->city);
$address_Detail->addChild("county", $address->county);
$address_Detail->addChild("country", $address->country);
$address_Detail->addChild("post_Code", $address->post_Code);
$fp = fopen("addresses.xml","wb");
fwrite($fp,$xml_Data->asXML());
fclose($fp);
}
?>
下面是修改後的Ajax調用:
function check_Address(){
$.ajax({
type: "POST",
url: "admin_Check_Address.php",
data: "username=" + $("#username").attr("value"),
success: function(return_Data){
$.ajax({
type: "POST",
url: "addresses.xml",
dataType: "xml",
success: function(xml_Data){
set_Address(xml_Data);
},
error: function(){
alert("Could not retrieve XML file.");
}
}); // end innerajax call
},
error: function(){
alert("Could not retrieve XML file.");
}
}); // end ajax call
}
的調整SET_ADDRESS功能
function set_Address(xml_Data){
$("#address_1").attr("value", $("address1", xml_Data).text());
$("#address_2").attr("value", $("address2", xml_Data).text());
$("#city").attr("value", $("city", xml_Data).text());
$("#county").attr("value", $("county", xml_Data).text());
$("#country").attr("value", $("country", xml_Data).text());
$("#code").attr("value", $("post_Code", xml_Data).text());
}
因此,我並不是完全100%地希望能夠在一次命中中完成ajax調用。所以,進一步建議非常歡迎。
第一:你真的需要逃避你輸出的XML結構,以及逃逸你在使用的值的值你的MySQL查詢。其次:您可能想要將內容類型設置爲XML,並刪除您以XML開頭的「開始XML」位。 – MatsLindh 2012-07-16 09:27:41
oops是「開始XML」不應該在那裏。 – codepuppy 2012-07-16 09:30:45