【问题标题】:jQuery AJAX request fails on PHP exceptionjQuery AJAX 请求因 PHP 异常而失败
【发布时间】:2009-07-22 15:03:37
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 您为 PHP 设置的 error_reporting 级别是多少?如果它没有设置为显示异常(但应该是),那么您将看不到任何输出。
  • 它确实显示错误,当抛出异常时,它会将整个回溯(HTML)作为错误消息输出。如果 PHP 没有显示错误(它确实显示了错误),逻辑上看 Javascript 应该弹出一个空警报框?

标签: php jquery exception header kohana


【解决方案1】:

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

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

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

【讨论】:

  • 这项工作,其他人有这个问题,看我下面贴的代码,谢谢!
【解决方案2】:

如果您想保持当前的错误报告级别,但仍向 jQuery 提供一个不错的错误消息,您可以将代码包装在 try-catch 块中。

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

【讨论】:

  • 我假设 Kohana 是这样做的,当发生异常时,Kohana 会将整个回溯作为错误消息 (HTML) 返回。只有标题不同。
  • 虽然如果你自己做,它可能不会一直冒泡到顶部并导致 Kohana 更改标题?只是把它扔在那里。
【解决方案3】:

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

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

【讨论】:

  • 但是当 JSON 被注释掉时(如我的示例和实时版本),它只会显示整个 HTML 输出?
【解决方案4】:

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

【讨论】:

  • 遇到新问题的时候我会看看那个,Firefox 在 Mac 上速度很慢,对于一些方便的插件来说太糟糕了
【解决方案5】:

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

【讨论】:

  • 这就是问题所在,是的
【解决方案6】:

感谢 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 );
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多