PHP异常时jQuery AJAX请求失败

时间:2009-07-22 15:03:37

标签: php jquery exception header kohana

我正在使用Kohana PHP Framework进行应用程序。现在我遇到了一个问题,当jQuery对某个文件发出AJAX请求时,它确实有效,但是当这个文件抛出PHP异常时,jQuery失败并且不显示该文件的输出。

一个小例子,这是Javascript:

$.post($('#' + e.currentTarget.id).attr('action'), $('#' + e.currentTarget.id).serialize(), function ( data )
{
    alert ( data );
}/*, 'json' */);

现在,当PHP文件执行此操作时(弹出警告框):

<?php echo 'Test'; ?>

但是当PHP文件中的某个地方发生这种情况时:

<?php throw new Exception ( 'Test' ); ?>

jQuery失败并且没有显示输出的HTML错误,PHP标题(由PHP生成?)也有差异:

使用PHP echo(好):

.   Connection:Keep-Alive
.   Content-Encoding:gzip
.   Content-Length:544
.   Content-Type:text/html; charset=UTF-8
.   Date:Wed, 22 Jul 2009 14:22:43 GMT
.   Keep-Alive:timeout=15, max=100
.   Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2
.   Vary:Accept-Encoding
.   X-Powered-By:PHP/5.2.6

PHP异常(失败):

.   Connection:close
.   Content-Encoding:gzip
.   Content-Length:1896
.   Content-Type:text/html; charset=UTF-8
.   Date:Wed, 22 Jul 2009 14:23:11 GMT
.   Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2
.   Vary:Accept-Encoding
.   X-Powered-By:PHP/5.2.6

现在我并没有真正看到问题,PHP的两种方式都回应了一些HTML。之前有人遇到过这个问题,你怎么解决这个问题?

感谢您的帮助!

6 个答案:

答案 0 :(得分:2)

要显示错误,可以在ajax调用中执行此操作。

jQuery.ajax({
    type: "POST",
    ...
    error: function(xhr, desc, e) {
       alert(xhr.responseText);
    }
});

这应该提醒您使用相同的html,抛出PHP异常会在常规页面上提供。

答案 1 :(得分:1)

如果你想保持当前的错误报告级别,但仍然给jQuery一个很好的错误信息,你可以将你的代码包装在try-catch块中。

try {
  // your code
} catch(Exception $e) {
  echo $e->getMessage();  // formatted nicely or a generic message or something.
}

答案 2 :(得分:0)

+1与Brian。 如果你想知道原因,这里是:jQuery期望接收JSON数据。当PHP输出错误时,它会输出不包含在引号内的HTML和纯文本,这不是有效的JSON,因此jQuery失败。

如果您注释掉'json'参数,那么如果没有任何反应,那是因为您的服务器发送的法规代码表示错误(任何法规代码&gt; 500)。如果您能向我们提供这些信息,那就太好了。

答案 3 :(得分:0)

我鼓励你试试Firefox的Firebug插件。 Firebug将允许您查看AJAX请求并查看应用程序返回的数据。

答案 4 :(得分:0)

正如一些人已经猜到的那样,Kohana的默认异常处理程序将HTTP响应状态设置为“500 Internal Server Error”。如果要将错误返回到JavaScript,则需要手动捕获异常并输出错误消息。

答案 5 :(得分:0)

感谢goreckm解决方案:

$.ajax({
    type    : 'POST',
    url     : $('#' + e.currentTarget.id).attr('action'), // http://www....
    dataType: 'json',
    data    : $('#' + e.currentTarget.id).serialize(), // Data to be sent
    success : function ( data )
    {
        alert ( data );
    },
    error   : function ( ajax_response )
    {
        alert ( ajax_response.responseText );
    }
});