javascript JSON.parse抛出JSON输入错误的意外结束

时间:2017-09-22 15:51:07

标签: javascript php mysql json ajax

我有2个文件tst.html和tst.php

tst.html 正文

-ObjC

和tst.php

<form> 
<input id="search" type="text" size="30" onkeyup="showresult(this.value)" >
<div id="suggest"></div>
</form>


<script>
function showresult(val){
    if(val.trim() == ""){

    }else{
        var xttp = new XMLHttpRequest() ;
        xttp.onreadystatechange = function () {

             var s = xttp.responseText ;           

            if(s.match("zerorow")){
                document.getElementById("suggest").innerHTML = "zero" ;
            }else {
                try {
                    window.alert(s) ;
                    var arr = JSON.parse(s) ;

                }
                catch(err) {
                    document.getElementById("suggest").innerHTML =  err.message;
                }



            }
        };
        xttp.open("POST" , "tst.php" ,true) ;
        xttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded") ;
        xttp.send("val="+val) ;
    }
}

假设在我的数据库中,我在标记列中有两个记录tag1和tag2 和

<?php
$servername = "localhost";
$dbusername = "mamad";
$dbpassword = "";
$dbname = "t1" ;

// Create connection
$conn = mysqli_connect($servername, $dbusername, $dbpassword , $dbname);

if (!$conn) {
die("Connection failedddddddddd: " . mysqli_connect_error());

}else{

$val = $_POST["val"] ;
$sql = "SELECT tag FROM tags WHERE tag LIKE '$val%'";
$result = mysqli_query($conn, $sql);

if($result){
    if(mysqli_num_rows($result) > 0){
        $arr = mysqli_fetch_all($result , MYSQLI_NUM) ;
        echo json_encode($arr) ;
    }else{
        echo "zerorow" ;
    }
}else{
    echo die("faileddd " . mysqli_connect_error());
}

}
?> 

如果您在输入字段tst.php中输入 t 字母 将二维数组作为字符串传递,如 [[&#34; tag1&#34;],[&#34; tag2&#34;]]

$arr = mysqli_fetch_all($result , MYSQLI_NUM) ;
json_encode($arr) ;

使用 JSON.parse抛出语法错误:JSON数据的第1行第1列意外的数据结尾消息

还有一个问题我只想要在我的数据库中想要表的数据列是否有任何函数可以执行它并给出一维数组?

抱歉,如果这个问题变得很长。

1 个答案:

答案 0 :(得分:0)

onreadystatechange事件会在每次状态更改时触发,不仅是请求已完成且返回结果。

您必须添加一些检查才能使其正常工作:

  • readyState必须处于状态DONE
  • http状态必须为200

在看起来像这样的代码中:

xttp.onreadystatechange = function () {
  if(xhr.readyState === XMLHttpRequest.DONE && xttp.status === 200) {
    var s = xttp.responseText ;           

    if(s.match("zerorow")){
      document.getElementById("suggest").innerHTML = "zero" ;
    } else {
      try {
        window.alert(s) ;
        var arr = JSON.parse(s) ;
      } catch(err) {
        document.getElementById("suggest").innerHTML =  err.message;
      }
    }
  }
};

提示:最好只使用一种返回类型。在你的情况下JSON。在您的代码中,您混合了不同的内容类型。那种糟糕的风格

此外,你的sql可以通过sql注入攻击。这是一个安全和安全问题