如何在涉及Ajax时管理错误服务器端(php)?

时间:2016-01-20 16:07:29

标签: php ajax controller

所以,我有一个阻止默认帖子提交的ajax调用,服务器端我做了一些验证和检查,如果数据是正确的我做了一些数据库操作(为用户插入项目等)但是如果数据不正确我不必做任何事情,但抛出一个错误(即已经存在的项目)。我在控制器中的情况是这样的:

            } else {
                print('Item already present');
            }

但现在我有一个管理错误的ajax调用:

error: function( xhr, status, errorThrown ) {
                    alert( "Sorry, there was a problem!" );
                    console.log( "Error: " + errorThrown );
                    console.log( "Status: " + status );
                    console.dir( xhr );
                },

很明显,php不会打印任何东西。 我应该如何修改我的php以便在ajax调用中表现良好?

2 个答案:

答案 0 :(得分:1)

当您进行ajax调用时,您应该期待返回特定类型的数据。一个典型的(示例)场景是使用JSON获取数据。如果您使用的是jQuery,那么我通常会在两个地方查找错误,因为我认为ajax错误有两种类型:

  1. 网络错误或导致网站错误的任何内容(404 - 未找到页面,500 - 潜在的编码错误等)。这是在ajax'错误'上面有处理函数。我相信你可以故意在PHP代码中触发错误来解决这个问题。
  2. 逻辑错误。这是您可能希望处理的错误 - 例如在通过ajax登录调用期间出现错误的用户名/密码。在这种情况下,您真的不想抛出PHP错误。相反,你想要返回一个错误,但也许还包括一些关于错误的元数据,例如'用户名不存在'或者其他什么。
  3. 因此,在您的php服务器上,您将有一个视图需要将标头设置为JSON响应,然后输出JSON错误,例如:

    <?php
    // output a json version of any list of objects that has the
    // "toArray()" method defined.
    // ...for ajax calls.
    header( 'Content-type: application/json' );
    
    $isError = 'false';
    
    if (checkToSeeIfErrorOccurred())
    {
      $isError = 'true',
      $errorMessage = getErrorMessages();
    }
    
    ?>
    
    <!-- define json result -->
    {
      error: "<?php echo $isError; ?>",
      errorMessage: "<?php echo $errorMessage; ?>"
    }
    

    因此,在您的客户端,在(例如)您的jquery ajax调用中,您将定义一个需要检查此错误的successHandler,并指定返回值的dataType。请注意,即使它是一个成功的手柄,成功&#39;部分只是意味着您没有抛出网络或编程/ PHP错误。因此,您仍需要检查可能在JSON中返回的逻辑错误:

    // your error handler
    function myErrorHandler( xhr, status, errorThrown )
    {
         alert( "Sorry, there was a problem!" );
         console.log( "Error: " + errorThrown );
         console.log( "Status: " + status );
         console.dir( xhr );
    };
    
    function mySuccessHandler( response )
    {
      // response is returned as an object
      if (response.error === 'true')
      {
         // maybe call same error handler?
         myErrorHandler( 'whoCares', 'logicalFailure', response.errorMessage );
      }
      else
      {
        // handle success
    
      }
    };
    
    
    $.ajax( 
      url,
      dataType: 'json',
      error: myErrorHandler,
      success: mySuccessHandler,
      ...
      );
    

    我不知道这对其他人来说是否是典型的,这只是一个例子,但对我来说效果很好......

答案 1 :(得分:0)

您可以考虑的一种方法是使用ajax来执行您的请求,然后使用php echo语句的结果返回xml。如果结果成功那么你的代码会做它需要做的事情作为php服务器的一部分返回你有一个xml错误标记,为什么它出错了然后在你的ajax中处理它。

另一种可以返回结果的方法是使用json。