2009-07-22 5 views
1

Я использую PHP-приложение Kohana для приложения. Теперь я столкнулся с проблемой, когда jQuery выполняет запрос AJAX к определенному файлу, но он работает, но когда этот файл генерирует исключение PHP, jQuery терпит неудачу и не отображает вывод файла.jQuery запрос AJAX завершается с ошибкой PHP

Небольшой пример, это кусок 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. У кого-то была эта проблема раньше, и как вы это исправили?

Спасибо за помощь!

+0

Что установлен ваш уровень error_reporting на для PHP?Если он не установлен для отображения исключений (хотя это должно быть), то вы не увидите никакого вывода. – inkedmn

+0

Он отображает ошибки, когда генерируется исключение, оно выводит всю обратную трассировку (HTML) как сообщение об ошибке. И IF PHP не показывает ошибок (что он делает), логически увиденный Javascript должен всплывать пустое поле оповещения? – Stefan

ответ

2

Чтобы показать, что это за ошибка, вы можете сделать это в своем вызове ajax.

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

Это должно предупредить вас о том же html, что выброс исключения PHP даст вам обычную страницу.

+0

Эта работа, у кого еще есть эта проблема, см. Код, который я разместил ниже, спасибо! – Stefan

1

Если вы хотите сохранить свой текущий уровень отчетности об ошибках, но все же дать хорошее сообщение об ошибке jQuery, вы можете обернуть свой код в блок try-catch.

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

Я предполагаю, что Kohana делает это таким образом, когда возникает исключение, Kohana вернет всю обратную трассировку как сообщение об ошибке (HTML). Различаются только заголовки. – Stefan

+0

Хотя, если вы сделаете это самостоятельно, это может не дотянуться до самого верха и заставить Кохану изменить заголовки? Просто бросил это там. –

0

+1 с Брайаном. Если вы хотите узнать причину, вот она: jQuery ожидает получения данных JSON. Когда PHP выводит свою ошибку, он выводит HTML и обычный текст, не заключенный в кавычки, и это недопустимо JSON, поэтому jQuery терпит неудачу.

Если вы закомментируете параметр «json», то, если ничего не происходит, это потому, что ваш сервер отправил код статута, представляющий ошибку (любой код статута> 500). Если бы вы могли предоставить нам эту информацию, это было бы хорошо.

+0

Но когда JSON прокомментирован (как в моем примере, так и в живой версии), он просто отобразит весь вывод HTML? – Stefan

+0

Должен, если ваш сервер не отправляет код статута 500. – FWH

0

Я бы посоветовал вам попробовать Firebug addon для Firefox. Firebug легко позволит вам просмотреть запрос AJAX и посмотреть, какие данные будут возвращены вашим приложением.

+0

Я посмотрю, что когда-нибудь появятся новые проблемы, Firefox медленный материал на Mac, слишком плохо для некоторых удобных плагинов. – Stefan

0

Как уже многие догадались, обработчик исключений по умолчанию для Kohana устанавливает статус ответа HTTP на «500 Internal Server Error». Если вы хотите возвращать ошибки на свой JavaScript, вам нужно будет ловить исключения и выводить сообщения об ошибках вручную.

+0

Это была проблема после всего, да – Stefan

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); 
    } 
}); 
Смежные вопросы