我正在使用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。之前有人遇到过这个问题,你怎么解决这个问题?
感谢您的帮助!
答案 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 );
}
});