json编码不能在ajax中工作

时间:2014-02-06 05:38:27

标签: javascript php ajax json

我试图使用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,它仍然给出了未定义的

2 个答案:

答案 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!');
      }
  }
}