JSON位置0处出现未预期的标记D错误。

3
这段代码在本地运行良好,但是当我将其上传到Linux服务器时,当我点击Division下拉菜单中的空白处(尽管没有从数据库中获取值它应该显示)时,在控制台上显示了数据错误

Uncaught SyntaxError:Unexpected token D in JSON at position 0 在JSON.parse() at XMLHttpRequest.stateck(index.php:xxx) stateck @ index.php: xxx

第xxx行属于此代码: var myarray = JSON.parse(httpxml.responseText);

<!DOCTYPE html>
<?php
include "../connect.php";// connection to database 
?>
<html lang="en">
<head>

  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>  

<script>
    function checkYearDistrict()
    {
         var year=document.getElementById( "year" ).value;
         var district=document.getElementById( "s2" ).value;

         if(year, district)
         {
              $.ajax({
              type: 'post',
              url: 'checkdata.php',
              data: {
                    yearID:year,
                    districtID:district,
                    },
              success: function (response) {
                    console.log(response );

                    if (response == 'false') {
                        $( '#year_status' ).html("Record Not Exist!");
                        $( '#district_status' ).html("<span>Record Not Exist!</span>");                     
                    } else {
                        json = JSON.parse(response);
                        $( '#year_status' ).html("OK");
                        $( '#district_status' ).html("<span style='color:red'>Record Already Exist.</span>");                       
                    }                     
              }
              });
         }
         else
         {

              $( '#district_status' ).html("");
              return false;
         }
    }



    function checkall()
    {        
         var yearhtml=document.getElementById("year_status").innerHTML;
         var districthtml=document.getElementById("district_status").innerHTML;

         if((yearhtml && districthtml)=="OK")
         {
            return true;
         }
         else
         {
            return false;
         }
    }

</script>

  </head>
<body>

<div class="container">

  <form name="testform" class="form-horizontal" method="POST" onsubmit="return checkall();>

    <div class="form-group">
    <div class="input-group">
    <span class="input-group-addon search_text_width">Year:</span>  
    <select id="year" name="year" class="form-control select2">
      <option value="">Select Year</option>
        <script>
            var myDate = new Date();
            var year = myDate.getFullYear();
            for(var i = 1999; i < year+1; i++){
                document.write('<option value="'+i+'">'+i+'</option>');
            }                   

        </script>

        <script type="text/javascript">
            function AjaxFunction()
            {
                var httpxml;
                try
                  {
                  // Firefox, Opera 8.0+, Safari
                  httpxml=new XMLHttpRequest();
                  }
                catch (e)
                {
                  // Internet Explorer
                    try
                    {
                         httpxml=new ActiveXObject("Msxml2.XMLHTTP");
                    }
                    catch (e)
                    {
                        try
                        {
                            httpxml=new ActiveXObject("Microsoft.XMLHTTP");
                        }
                        catch (e)
                        {
                            alert("Your browser does not support AJAX!");
                            return false;
                        }
                    }
                }

                function stateck() 
                {
                    if(httpxml.readyState==4)
                    {
                        //alert(httpxml.responseText);
                        var myarray = JSON.parse(httpxml.responseText);
                        // Remove the options from 2nd dropdown list 
                        for(j=document.testform.dist.options.length-1;j>=0;j--)
                        {
                            document.testform.dist.remove(j);
                        }


                        for (i=0;i<myarray.data.length;i++)
                        {
                            var optn = document.createElement("OPTION");
                            optn.text = myarray.data[i].dis_name;
                            optn.value = myarray.data[i].dis_id;  // You can change this to subcategory 
                            document.testform.dist.options.add(optn);

                        } 
                    }
                } // end of function stateck

                var url="dd.php";
                var div_code=document.getElementById('s1').value;
                url=url+"?div_code="+div_code;
                url=url+"&sid="+Math.random();
                httpxml.onreadystatechange=stateck;
                //alert(url);
                httpxml.open("GET",url,true);
                httpxml.send(null);
              }
        </script>  
    </select>   
    </div>  

    <br>
    <?php   require "config.php";   ?>
    <div class="input-group">
    <span class="input-group-addon search_text_width">Division</span>
        <select name="div" id="s1" class="demoInputBox form-control" onchange="AjaxFunction();">
            <option value="">Select Division</option>
            <?php
            $sql="select * from division ";  

            foreach ($dbo->query($sql) as $row) 
            {
                echo "<option value=$row[div_code]>$row[div_name]</option>";
            }
            ?>
        </select>
    </div>
    <br>
    <div class="input-group">
        <span class="input-group-addon search_text_width">District</span>
        <select name="dist" id="s2" class="demoInputBox form-control" onchange="checkYearDistrict();">
            <option value="">Select District</option>
        </select>       
    </div>
    <center><span id="district_status"></span></center>

    <br>
    <div class="input-group">
        <div class="col-sm-offset-3 col-sm-10">
            <input type="submit" class="btn" name="submit" value="Save Record">
        </div>
    </div>
  </form>
</div>
</body>
</html>

这意味着响应不是 JSON 格式,因此无法解析。 - Sandeep Nayak
2个回答

1

不要返回 text/ html 格式的响应,可以请求 JSON 数据。

只需在 ajax 调用中添加一个属性 DataType: JSON,并使用 PHP 中的 json_encode() 将响应以 JSON 格式发送即可。

$.ajax({
  type:"POST",
  url:"test.php",
  data:{data:'data'},
  dataType: 'json',
  success: function(data){
    if(data['success']=='true'){
        alert('success');
    }else{
      if(data['success']=='false'){
        alert("not success");
      }
    }
  }
});

Test.php

   if($_POST['data']==1){
      $response['success'] = "true";
   } else {
      $response['success'] = "false";
   }

echo json_encode($response);

这是我编写的checkdata.php代码,请评论如何编辑以解决问题。`<?php if(isset($_POST['yearID']) && isset($_POST['districtID'])) { $year=$_POST['yearID']; $district=$_POST['districtID']; $checkdata=" SELECT year, district FROM indicators WHERE year='$year' and district='$district' "; $query=$conn->query($checkdata); if($year=$query->fetch_assoc()) { echo json_encode($year);
} else { echo 'false'; } exit(); } ?>`
- nat8991
if(isset($_POST['yearID']) && isset($_POST['districtID'])) { $response = array(); $year=$_POST['yearID']; $district=$_POST['districtID']; $checkdata=" SELECT year, district FROM indicators WHERE year='$year' and district='$district' "; $query=$conn->query($checkdata); if($year=$query->fetch_assoc()) { $response['success'] = "true"; $response['year'] = $year; } else { $response['success'] = "false"; } echo json_encode($response); exit(); } ?> - Vaibhav Malve
以下是dd.php代码:`<?Php @$div_code=$_GET['div_code'];if(!is_numeric($div_code)){ echo "数据错误"; exit; }$sql="select dis_name, dis_id from t_hdms_code_district where dis_div_id='$div_code'"; $row=$dbo->prepare($sql); $row->execute(); $result=$row->fetchAll(PDO::FETCH_ASSOC);$main = array('data'=>$result); echo json_encode($main); ?>` - nat8991
数据错误似乎来自于控制台跟踪中的dd.php。 - nat8991

0

我因为函数返回了"return VoucherNo;"而遇到了相同的错误。当我改成了"return new JavaScriptSerializer().Serialize(VoucherNo);"后,就不会再出现错误了。

            public string SaveDetails(string Mode)
        {
            int res = 0;
            int res1 = 0;
            string VoucherNo = "";
            try
            {

            }
            catch (Exception ex)
            { }

            //return VoucherNo;
            return new JavaScriptSerializer().Serialize(VoucherNo);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接