即使json_encode正确并且一切正常,Ajax请求始终会触发错误

时间:2017-08-24 01:14:02

标签: javascript php jquery json ajax

我正在进行电子商务,我实施了一个AJAX请求,以便在购物车中添加和删除商品。每次jQuery执行一切正常,它总是返回 200 OK ,但错误事件被触发而不是成功。

这就是它的工作方式:

每当用户点击“添加到购物车”按钮时,Jquery将检查此项是否可用,然后将INSERT,ADD或Return Error:

  • 状态1 =产品已插入购物车(空购物车,第一次添加此产品)
  • 状态2 =产品已添加到购物车(此产品已在购物车中,另外加+1)
  • 状态3 =库存不足(所有产品已在购物车上)

jQUERY CODE

$.ajax({

    type: "GET",
    url: "addCart.php",
    data: { id: id, color: color },
    dataType: "json",

    success: function(result){ 
        if (result.status == 1){ alert("Product Inserted into Cart"); }
        if (result.status == 2){ alert("Product Added to Cart"); }
        if (result.status == 3){ alert("Not enough Stock"); }
    },

    error: function (result) {
        alert(result.responseText)
    }   

});

PHP代码(addCart.php)

## I REMOVED NON-RELEVANT CODES TO SIMPLIFY THIS QUESTION BUT ALL VALIDATIONS
## HAVE ALREADY BEEN DONE, THEN RETURN THE JSON RESPONSE...

if ($status == 1){
    $status_txt = "Product Inserted into Cart";

}elseif ($status == 2){
    $status_txt = "Product Added to Cart";

}elseif ($status == 3){
    $status_txt = "Not enough stock";

}

echo json_encode(array("status" => $status, "alert" => $status_txt));

每次执行代码时,一切都按预期工作,项目被添加到购物车,所有INSERTS和UPDATES都完成,它总是返回200 OK BUT 错误事件被触发成功。

重要事项/////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////////////////////////////////

字符串 $ status $ status_txt (addCart.php)永远不会返回空值,它们总是返回一个整数和一条短信。要避免空值(“”)解析错误。

我已经尝过但但没有工作的事情://///////////////////////////////// ///////////////////////////////////////

  • 删除(dataType:“json”)
  • 将dataType:“json”更改为“text”
  • 强制标题('Content-Type:application / json');
  • 使用exit();在json_encode之后
  • 检查我的JSON在外部网站上是否有效,即:jsonlint.com

我已经设法解决了我的问题。我使用了Javascript substr(),在错误 responseText 时获取状态编号,然后对Ajax错误事件进行了所有验证:

JAVASCRIPT WORKAROUND

    error: function (result) {

        status = result.responseText.substr(10, 1); 
        if (status == 1){ alert("Product Inserted into Cart"); }
        if (status == 2){ alert("Product Added to Cart"); }
        if (status == 3){ alert("Not enough Stock"); }

    }

responseText 返回Json结果:

{"status":1,"alert":"Product inserted to Cart"}

使用 substr()将返回状态编号(1,2或3):

status = result.responseText.substr(10, 1); 

我知道这不是解决这个问题的正确方法,这就是为什么我要修复这个让我疯狂的错误......

我做错了什么?我已经多次使用过这段代码了,之前我从来没有遇到过这个问题,我在StackOverflow上看过很多类似的问题但是没有一个能为我工作......

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您的JSON响应正文无效。这可以在your comment ...

中看到
  

我得到Array{"status":1,"alert":"Product Inserted"}

“Array”前缀无效,通常是PHP echo JSON之前的意外数组到字符串转换的指示符。例如

echo [1,2,3]; // Notice: Array to string conversion in ...

开发时,您应始终运行PHP,并将错误报告设置为最高级别。在输出中显示错误也是提醒的最快方式。

你有两个选择......

  1. 在您的开发环境的php.ini文件中,设置

    error_reporting = E_ALL
    

    display_errors = On
    
  2. 在您的代码中

    ini_set('display_errors', 'On');
    error_reporting(E_ALL);
    
  3. 这可以帮助您追踪任何意外输出(它确实如此)。

    此外,您错过了客户端错误处理程序中的重要信息。回调的签名是

    Function( jqXHR jqXHR, String textStatus, String errorThrown )
    

    您可以通过简单的

    获得一些有价值的见解
    console.error(textStatus, errorThrown)
    

答案 1 :(得分:-3)

为我工作

<强> addCart.php

<?php
// your inserts and checking here.    
$str = json_encode(array("status" => $status, "alert" => $status_txt));
echo $str;

并在AJAX请求中

$.ajax({
  url: 'ajax/addCart.php',
  type: 'POST',
  data: { id: id, color: color },
  dataType: 'json',
  success: function(res){
     console.log(res['status']);
     if (res['status'] == 1) {
       console.log('nice');
     }
  },
  error: function(s) {
     console.log(s.responseText);
  }
});