我试图使用AJAX将数组从PHP发送到Javascript。该数组包含从数据库中检索的字段。 我尝试使用JSON_encode发送数组,但它返回一个空值。我在互联网上阅读,发现问题是内容类型。内容类型必须设置为text / JSON。 但是我已经在php代码中使用了text / XML,我认为这是javascript中的AJAX调用所必需的。(我尝试用text / json替换text / xml但是xmlhttpObject变为null) 这是PHP代码:
<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
echo '<response>';
require 'connect.inc.php';
$sub=$_GET['sub'];
$no=$_GET['no'];
$query="SELECT * FROM ".$sub." WHERE id='".$no."'";
if($query_run=mysql_query($query)) {
if($query_row=mysql_fetch_assoc($query_run)) {
$ques=$query_row['question'];
$op1=$query_row['op1'];
$op2=$query_row['op2'];
$op3=$query_row['op3'];
$op4=$query_row['op4'];
$ans=$query_row['ans'];
$result = mysql_query("select count(1) FROM ".$sub);
$row = mysql_fetch_array($result);
$total = $row[0];
$array=array($ques,$op1,$op2,$op3,$op4,$ans,$total,$id);
echo json_encode($array);
}
} else {
echo mysql_error();
}
echo'</response>';
?>
这是处理服务器响应的javascript片段:
function handleServerResponse() {
if (xmlHttp1.readyState == 4) {
if (xmlHttp1.status == 200) {
xmlResponse = xmlHttp1.responseXML;
xmlDocumentElement = xmlResponse.documentElement;
message = xmlDocumentElement.firstChild.data;
array = JSON.parse(message);
document.getElementById('question').innerHTML = array[0];
document.getElementById('option1').innerHTML = array[1];
document.getElementById('option2').innerHTML = array[2];
document.getElementById('option3').innerHTML = array[3];
document.getElementById('option4').innerHTML = array[4];
answerArray[qno] = array[5];
noOfQuest = array[6];
}
else {
alert('Something went wrong!');
}
}
}
array = JSON.parse(message)返回null。我认为这是因为消息为空。 我该如何解决这个问题?
非常感谢
更新:我检查了'消息',它说未定义。 我也尝试从php发送一个单独的值到没有json编码的js,它仍然给出了未定义的
答案 0 :(得分:0)
如果您只想输出json,则必须更改php文件中的某些行,如
(参见最后五行):
<?php
header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>';
echo '<response>';
require 'connect.inc.php';
$sub=$_GET['sub'];
$no=$_GET['no'];
$query="SELECT * FROM ".$sub." WHERE id='".$no."'";
if($query_run=mysql_query($query)) {
if($query_row=mysql_fetch_assoc($query_run)) {
$ques=$query_row['question'];
$op1=$query_row['op1'];
$op2=$query_row['op2'];
$op3=$query_row['op3'];
$op4=$query_row['op4'];
$ans=$query_row['ans'];
$result = mysql_query("select count(1) FROM ".$sub);
$row = mysql_fetch_array($result);
$total = $row[0];
$array=array($ques,$op1,$op2,$op3,$op4,$ans,$total,$id);
}
} else {
$array = array('result' => 'error', 'message' => mysql_error());
}
echo json_encode($array);
?>
答案 1 :(得分:0)
AJAX中的 X 非常具有欺骗性,“AJAX”请求不必使用XML;事实上,现在几乎没有现代代码使用XML代替AJAX。
XML和JSON是两种不同的数据交换格式。将其编码为一个或另一个。 JSON是最好的,因为在JavaScript和大多数其他语言中读取和写入都非常容易。
删除PHP中的所有XML内容,发送为application/json
并使用responseText
检索它而不是responseXML
。
<?php
header('Content-Type: application/json');
require 'connect.inc.php';
$sub=$_GET['sub'];
$no=$_GET['no'];
// VERY IMPORTANT, escape all uses provided data before using it in a query!!!
$sub=mysql_real_escape_string($sub);
$no=mysql_real_escape_string($no);
$query="SELECT * FROM ".$sub." WHERE id='".$no."'";
if($query_run=mysql_query($query)) {
if($query_row=mysql_fetch_assoc($query_run)) {
$ques=$query_row['question'];
$op1=$query_row['op1'];
$op2=$query_row['op2'];
$op3=$query_row['op3'];
$op4=$query_row['op4'];
$ans=$query_row['ans'];
$result = mysql_query("select count(1) FROM ".$sub);
$row = mysql_fetch_array($result);
$total = $row[0];
$array=array($ques,$op1,$op2,$op3,$op4,$ans,$total,$id);
echo json_encode($array);
}
} else {
// send a 500 HTTP error code so the browser knows there was an error
// when handling the AJAX.
header('HTTP/1.1 500 Internal Server Error');
echo mysql_error();
}
?>
您会注意到我使用`mysql_real_escape_string来转义用户提供的数据。这样做对于避免SQL injection attacks非常重要。最好切换到mysqli并使用它执行prepared statements的能力,以确保在查询中不会意外使用未转义的用户数据。
function handleServerResponse() {
if (xmlHttp1.readyState == 4) {
if (xmlHttp1.status == 200) {
// make sure to declare your local variable with the var statement
// or they will be implied globals!
var json = xmlHttp1.responseText;
var array = JSON.parse(json);
document.getElementById('question').innerHTML = array[0];
document.getElementById('option1').innerHTML = array[1];
document.getElementById('option2').innerHTML = array[2];
document.getElementById('option3').innerHTML = array[3];
document.getElementById('option4').innerHTML = array[4];
answerArray[qno] = array[5];
noOfQuest = array[6];
}
else {
alert('Something went wrong!');
}
}
}