即使json_encode正确并且一切正常,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 但是错误事件被触发而不是成功。

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

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

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

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

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

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上看过很多类似的问题但是没有一个能为我工作……

任何帮助表示赞赏!

您的JSON响应正文无效。 这可以在你的评论中看到……

我得到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); 

这应该可以帮助您追踪任何意外输出(它确实如此)。


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

 Function( jqXHR jqXHR, String textStatus, String errorThrown ) 

您可以通过简单的操作获得一些有价值的见解

 console.error(textStatus, errorThrown) 

为我工作

addCart.php

  $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); } });