Php 如何确定ajax请求中的失败

Php 如何确定ajax请求中的失败,php,ajax,mootools,Php,Ajax,Mootools,我正在使用Mootools开发一个简单的ajax-y页面,该页面使用PHP作为后端对db记录进行一些操作 我将ajax请求提交到一个PHP页面,该页面调用一个函数并返回TRUE或FALSE,如果记录能够被更新/删除 但是,似乎mootoolsonSuccess事件会在服务器返回200状态时触发,而不管返回的值是什么(例如FALSE仍然被认为是成功的) 除了返回40倍的错误代码或其他什么之外,我如何以有意义的方式使用onSuccess?就个人而言,我觉得使用HTTP状态代码来指示服务器上应该发生的

我正在使用Mootools开发一个简单的ajax-y页面,该页面使用PHP作为后端对db记录进行一些操作

我将ajax请求提交到一个PHP页面,该页面调用一个函数并返回
TRUE
FALSE
,如果记录能够被更新/删除

但是,似乎mootools
onSuccess
事件会在服务器返回200状态时触发,而不管返回的值是什么(例如
FALSE
仍然被认为是成功的)


除了返回40倍的错误代码或其他什么之外,我如何以有意义的方式使用onSuccess?

就个人而言,我觉得使用HTTP状态代码来指示服务器上应该发生的事情的成功/失败是不正确的。HTTP调用本身的一切工作都非常完美——服务器无法完成请求并不意味着HTTP请求失败

这就像开车去商店买东西,结果却发现缺货。对我来说,返回HTTP404意味着存储本身已经消失了。然而,你已经成功地开车去了商店,走进去,走出去,开车回家

因此,使用JSON数据结构来指示请求的事务的结果,您可以在客户端代码中检查这些结果:

$results = array()
$results['success'] = false;
$results['failure_code'] = XXX; // some code meaningful to your app
$results['failure_message'] = 'Something dun gone blowed up, pa!';
echo json_encode($results);
然后在您的Moo代码中:

if (!results['success']) {
   alert("AJAX call failed: " + results['failure_message']);
}
如果这个电话有效的话,你就会

$results = array();
$results['success'] = true;
$results['data'] = ....;

你有两个选择,其中两个是你在问题中提到的。您可以使用onSuccess并根据真/假响应执行一些代码,如下所示:

onSuccess: function(responseText, xml){
    if(responseText == "false"){
        // do something...
    }
}
或者,您可以在PHP代码中引发错误,返回实际有效的错误代码,从而触发onFailure事件

或者正如Marc之前提到的,您可以使用JSON响应格式,在这种情况下,您可以使用MooTools的Request.JSON

onSuccess: function(responseJSON, responseText){
    // do something...
}

@dombenoit和@Marc给出的所有答案在技术上都是正确的

然而,我完全不同于@Marc的设想:对我来说,使用HTTP状态码对于web服务来说既有效又常见。我一直在使用它们,并且非常喜欢它们而不是输出文本,主要原因如下:

  • 它们为处理不正确的值提供了一个免费的标准,而不是让您输出文本并在客户端对其进行解析,这意味着语义重复
  • 正如问题本身所概述的那样,他们让所有的工具都明白出了什么问题
  • 他们在建筑中感觉很好
  • 为了支持这一愿景,这里有一个问题:你打电话的目的是什么?是更新还是删除记录?那么如果这个目标没有实现,就出了问题。它失败了,应用程序应该在应用程序级别知道它,而不是先说
    200/OK
    ,然后在文本响应中精确指出它没有!对我来说,这就像使用
    未定义的
    而不是
    未定义的

    因此,在这里,我要让PHP发送一个HTTP错误状态代码,它位于
    4xx
    -
    5xx
    范围内


    然后,一个好问题是:使用哪种代码?这是一个完全取决于您的应用程序和您想要达到的特定程度的设计决策

    • 如果调用的目标是更新/删除,并且不发生这一事实的可能性非常小,并且是一个意外的严重错误(例如:DB不一致,因为调用无法引用不存在的实体),那么您应该使用
      500/内部服务器错误
    • 如果目标实体在通话时可能不存在,而不会出现严重错误(例如:您的应用程序提供了多种删除项目的方法,因此可以使用另一种方法来代替此通话),那么我建议
      410/Gone
      :您可以获得清晰、表达性的错误处理,免费!对于实际错误(DB连接异常…),您仍然可以使用
      500
    • 然后,您可以更具体地了解更新错误,例如
      409/Conflict
      ,如果这是您试图通过更新预见的错误类型
    当我设计一个网络应用程序的时候,我总是看一看


    为了完整起见,这就是在PHP中发送头的方式(至少没有框架-检查具体情况):


    更新:由于您似乎决定采用建议使用JSON编码成功或失败的答案,因此我必须补充以下关于弹性的要点

    不依赖于状态代码,只依赖于应用程序级数据,这会使代码非常脆弱。事实上,在某些情况下,您实际上会遇到意想不到的错误。不是您自己提出的应用程序级“异常”,而是较低级别的错误(服务器不可用、导致服务器崩溃的错误配置、更改的路由系统…)。这些都将通过HTTP状态代码(或超时)显示,但不会通过JSON编码的答案显示,因为您的应用程序在能够输出任何内容之前已经崩溃

    正如@Dimitar所说,从编程的角度来看,这有点“幼稚”:你不仅信任你的代码(你不应该),而且信任环境(服务器)和网络。这是一个非常非常乐观的愿景


    使用状态代码作为处理预期异常情况的标准方法,可以让您自由处理这些意外情况:您已经注册了除成功的
    onSuccess
    之外的其他处理程序,并且应该是好的处理程序(重试一次,通知用户,提供备份可能性…。

    我同意您的看法!谢谢你的提示。很抱歉,我强烈不同意你对HTTP状态码的理解。他们很少谈及“HTTP调用本身”。例如,404明确表示找不到该页面,与HTTP无关。使用HTTP状态
    header("HTTP/1.0 404 Not Found");