Запрос jQuery AJAX завершается с ошибкой при исключении PHP

StackOverflow https://stackoverflow.com/questions/1165955

Вопрос

Я использую PHP-фреймворк Kohana для приложения.Теперь я сталкиваюсь с проблемой, когда 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.У кого-то уже была эта проблема, и как вы это исправили?

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Решение благодаря 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 );
    }
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top