如果PHP没有返回json_encoded格式,则Ajax无法正常工作

时间:2017-11-28 14:21:16

标签: php jquery json

我有这个php,如果触发错误则返回一个数组,否则返回<DIV>

if(!empty($error)) {
   $true = true;
   $res = array('info' => '$error', 'error' => '$true');

   echo json_encode($res);
   die();

} else {
   // no error
   echo "<div> no error </div>";

}

我认为我的问题在于dataType:json参数,因为它需要JSON_ENCODED格式?如果满足<DIV>条件,我只想附加else(非json_encoded)。

$.ajax
  ({
    type        : 'POST', 
    url         : 'submitForm.php',
    data        : formData,
    dataType    : 'json',
    success     : function(data) {

    if(data.error == true) {
        console.log(data.info); //display error
      } else {
        console.log(data);
        //some jquery to append the <div>
    }
  }
})

检查标题似乎没问题,预览标签返回<DIV>数据

Request Method:POST
Status Code:200 OK

但它没有追加, Nor <DIV>中显示console.log

如果满足某个PHP条件,有没有办法可以禁用dataType?或者,在同一PHP文件中使用非json_encoded格式处理json_encoded的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

也可以使用json返回你的html

PHP

if(!empty($error)) {
   $true = true;
   $res = array('info' => $error, 'error' => $true);
} else {
   // no error
   $res = array('html'=>"<div> no error </div>");
}
echo json_encode($res);

HTML

$.ajax
  ({
    type        : 'POST', 
    url         : 'submitForm.php',
    data        : formData,
    dataType    : 'json',
    success     : function(data) {

    if(data.error == true) {
        console.log(data.info); //display error
      } else {
        console.log(data);
        $('div').append(data.html);
    }
  }
})

答案 1 :(得分:0)

使用json进行错误,使用html(或伪html)进行常规回复对我有点困难。

话虽如此,如果您真的想要这样做,您显然无法使用dataType: 'json'选项,因为这会指示$.ajax()期望(和解析)json数据因此,如果收到的内容不是有效的json字符串,则会抛出异常。

但无论如何,你可以通过自己解析json数据来模拟它。例如:

dataType: "text",
success: function(data) {
    try {
        data = JSON.parse(data);
        if (! data.error) { // What if you send json witout error flag?
            data.error = true;
            data.info = "Received json without error info."
        };
    } catch (e) {
        data = {
            contents: data,
        };
    };

    if (data.error) {
        console.log(data.info);
    } else {
        console.log(data.contents);
        // Or whatever you want to do wit received STRING
},