JSON.parse错误,请告诉它有什么问题?

时间:2015-08-18 16:15:45

标签: ajax json

尝试此代码后,我从firebug收到此错误:SyntaxError:JSON.parse:JSON数据第2行第1列的意外字符。

因为我对json有一点了解,所以我自己无法理解。您能否看看我的代码,请告诉我错误应该来自哪里?请不要再把它搁置。

这是我的ajax代码:

function sortSubcat(str)
{
if (str=="")
{
 document.getElementById("subcat").innerHTML="";
 return;
} 
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
 xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
 }
 xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
    var response = JSON.parse(xmlhttp.responseText);
    var selectElement = document.getElementById('subcat');
    for(var i = 0; i < response.length; i++)
    {
        var idx = i+1;
        selectElement.options[idx] = new Option(response[idx].value, response[idx].name, false, false);
     }   
 }
}

 xmlhttp.open("GET","/member/sortsubcat.php?q="+str,true);
 xmlhttp.send();
}

这是我的php:

<?php
require_once("../configs/dbconnect.php");
if (!empty($_GET['q'])){
 $q = basename($_GET['q']);
$sql="SELECT * FROM subcat WHERE maincat=:q";
$result = $conn->prepare($sql);
$result->bindParam(':q', $q);
$result->execute();
echo "<option value=''>Please select a sub category</option>";
$returned_string = '[';
foreach($result as $row)
{
//echo "<option value='$row[name]'>$row[name]</option>";
 $returned_string .= '{"name" : "'. $row['name']. '", "value" : "'. $row['name']. '"},';
}
 $returned_string = substr($returned_string, 0, -1); //remove trailing ','
 $returned_string .= ']';
 header("Content-type: application/json");
 echo $returned_string;
 exit;
}
else{
  echo "<option value=''>Please select a sub category</option>";
 }
 $conn=null;
 ?>

以下是来自ajax的回复:

[{"name" : "sub1", "value" : "sub1"},{"name" : "sub2", "value" : "Sub2"}]

2 个答案:

答案 0 :(得分:1)

也许我在这里误解了一些东西,但如果您发布了AJAX回复

<option value=''>Please select a sub category</option>[{"name" : "sub1", "value" : "sub1"},{"name" : "sub2", "value" : "Sub2"}]

应该是JSON,问题是响应不是 JSON。第一部分是HTML,第二部分是JSON。如果您的代码需要JSON,它将不接受HTML / JSON混合。

答案 1 :(得分:0)

首先,如果您要输出JSON,那么您也无法输出HTML,因此您需要删除您回显<option>标记的位。

其次,如果您正在输出JSON,那么您真的应该使用PHP的内置json_encode()函数,而不是自己构建JSON字符串。

以下是您的代码所做的更改:

<?php
require_once("../configs/dbconnect.php");
$output = [];
if (empty($_GET['q'])){
    $q = basename($_GET['q']);
    $sql="SELECT name as name, name as value FROM subcat WHERE maincat=:q";
    $result = $conn->prepare($sql);
    $result->bindParam(':q', $q);
    $result->execute();

    foreach($result as $row) {
        $output[] = $row;
    }
}
echo json_encode($output);
?>