1

我正在将 Kohana PHP 框架用于应用程序。现在我遇到了一个问题,当 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 回显(好):

.   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。以前有人遇到过这个问题,你是怎么解决的?

谢谢您的帮助!

4

6 回答 6

2

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

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

这应该使用与在常规页面上抛出 PHP 异常给您相同的 html 来提醒您。

于 2009-07-22T16:25:02.450 回答
1

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

try {
  // your code
} catch(Exception $e) {
  echo $e->getMessage();  // formatted nicely or a generic message or something.
}
于 2009-07-22T15:09:47.727 回答
0

+1 与布赖恩。如果你想知道原因,这里是:jQuery 期望接收 JSON 数据。当 PHP 输出它的错误时,它输出 HTML 和没有用引号括起来的纯文本,这不是有效的 JSON,所以 jQuery 失败。

如果您注释掉“json”参数,那么如果没有任何反应,那是因为您的服务器发送了一个代表错误的状态代码(任何状态代码> 500)。如果您能向我们提供这些信息,那就太好了。

于 2009-07-22T15:15:35.940 回答
0

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

于 2009-07-22T16:49:29.827 回答
0

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

于 2009-07-22T17:26:25.963 回答
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 );
    }
});
于 2009-07-22T17:52:57.873 回答