Обработка ошибок MySQL при использовании Ajax

Добавлен заголовок в PHP-код и ловушка в Ajax, но все равно без радости.

У меня возникли проблемы с обработкой ошибок MySQL при использовании Ajax для обработки отправки форм. У меня есть следующий код:

var url = "save.php"; // the script where you handle the form input.

    $.ajax({
        type: "POST",
        url: url,
        data: $("#frmSurvey").serialize(), // serializes the form's elements.


        success: function(jqXHR, textStatus, errorThrown){

                $('.sequence-container div').hide().delay( 2000 );
                $next.show().delay( 2000 );



        },
        error: function(jqXHR, textStatus, errorThrown){
            if (jqXHR.status === 0) {
                            alert('Not connect.\n Verify Network.');
                        } else if (jqXHR.status == 503) {
                alert('Error: ' + jqHXR.responseText);
            }    else if (jqXHR.status == 404) {
                            alert('Requested page not found. [404] - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist.');
                        } else if (jqXHR.status == 500) {
                            alert('Internal Server Error. [500] - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                        } else if (exception === 'parsererror') {
                            alert('Requested JSON parse failed - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                        } else if (exception === 'timeout') {
                            alert('Time out error - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                        } else if (exception === 'abort') {
                            alert('Ajax request aborted - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                        } else {
                            alert('Uncaught Error.\n' + jqXHR.responseText + ' - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                        }
          }

    }); 

Это отлично работает и обрабатывает любые ошибки, такие как отсутствие страниц и т. д.

Тем не менее, я совершенно не понимаю, как затем обрабатывать/отображать пользователю любые ошибки, которые могут возникнуть при фактической отправке в базу данных.

В настоящее время я пробовал это:

if ($mysql_error!="") {
        header('HTTP/1.1 503 Service Unavailable');
                    printf("Unexpected database error: %s\n", $mysql_error);
        mysqli_stmt_close($proc);
        mysqli_clean_connection($link);
        exit();
    }

Но поскольку страница не отображается (поскольку она отправляется Ajax), сообщение об ошибке не появляется. Я думаю, что мне нужно вернуть это сообщение об ошибке в сценарий Ajax, чтобы отобразить его пользователю (правильно ли это?) - и я не уверен, как это сделать.

Любые указатели/предложения?


person Homer_J    schedule 13.08.2013    source источник


Ответы (2)


Я бы перенес всю вашу логику ошибок с jQuery на PHP. Вы можете ответить простым объектом JSON, который может содержать status (успех или ошибка), code (при необходимости), message и даже data, если вы хотите предоставить конкретные результаты.

Например, вы делаете такой запрос:

$.ajax({
  type: 'POST',
  url: url,
  data: $("#frmSurvey").serialize(),
  success: function(result){
    var json = $.parseJSON(result);
    if(json.response.status == 'success') {
      // do something
    } else {
      // look at message or code to perform specific actions
    }
  }
});

Затем в файле PHP, обрабатывающем этот запрос, вы создаете массив со всеми вышеупомянутыми элементами, которые вам нужны (статус, код, сообщение и т. д.). В конечном итоге вы получите echo что-то вроде этого:

$result = array(
  'response' => array(
    'status' => 'error',
    'code' => '1', // whatever you want
    'message' => 'Could not connect to the database.'
  )
);    

echo json_encode($result);

Массив $result будет содержать соответствующие данные, основанные на проверках, которые вы делаете в PHP.

Надеюсь это поможет!

person NightHawk    schedule 13.08.2013
comment
спасибо за ответ - ценю. Я изо всех сил пытаюсь понять это - умственный блок. Я предполагаю, что мне нужно указать как успех, так и ошибку в массиве? - person Homer_J; 13.08.2013
comment
понял - поместил массив как в разделы ошибок, так и в разделы успеха PHP-кода, соответствующим образом изменил, и он работает! Спасибо. - person Homer_J; 13.08.2013
comment
Еще одно замечание: я бы сделал сообщения об ошибках более прозрачными для пользователя. Зарегистрируйте ошибку и создайте электронное письмо для вас, а затем предоставьте пользователю упрощенное сообщение. Все, что действительно нужно пользователю знать, это сработал его запрос или нет. Если есть что-то, что они могут сделать, чтобы это исправить, вы можете сообщить им об этом, кроме этого, подойдет простое Сожалеем, но в нашем приложении возникла проблема. - person NightHawk; 14.08.2013

Отправить заголовок 503

<?php
header('HTTP/1.1 503 Service Unavailable');

и ваш ajax-код должен работать.

Изменить: будет использоваться ваш код ошибки, и вы сможете проверить функцию для кода состояния 503.

jqXHR.status

будет 503 и

jqXHR.responseText

будет содержать ваше сообщение.

Edit2: js.file

var url = "save.php"; // the script where you handle the form input.

$.ajax({
type: "POST",
url: url,
data: $("#frmSurvey").serialize(), // serializes the form's elements.

success: function(jqXHR, textStatus, errorThrown){
    if (jqXHR.status == 404) {
        alert('Error: ' + jqHXR.responseText);
    }else{
        $('.sequence-container div').hide().delay( 2000 );
        $next.show().delay( 2000 );
    }


},
error: function(jqXHR, textStatus, errorThrown){
    if (jqXHR.status === 0) {
                    alert('Not connect.\n Verify Network.');
                } else if (jqXHR.status == 404) {
                    alert('Requested page not found. [404] - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist.');
                } else if (jqXHR.status == 500) {
                    alert('Internal Server Error. [500] - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                } else if (errorThrown === 'parsererror') {
                    alert('Requested JSON parse failed - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                } else if (errorThrown === 'timeout') {
                    alert('Time out error - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                } else if (errorThrown === 'abort') {
                    alert('Ajax request aborted - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                } else {
                    alert('Uncaught Error.\n' + jqXHR.responseText + ' - Click \'OK\' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist');
                }
  }

});

сохранить.php:

<?php
header('HTTP/1.1 503 Service Unavailable');
echo('hallo welt');
exit();

результат:

Uncaught Error.
hallo welt - Click 'OK' and try to re-submit your responses - if this error box re-appears, call 01255 850051 and we will assist
person Markus Madeja    schedule 13.08.2013
comment
Привет, Маркус, не уверен, что вышеизложенное сделает? Код Ajax работает и показывает ошибки, когда страниц нет. Поможет ли вышеизложенное с обработкой error сообщений, возвращаемых mysql? - person Homer_J; 13.08.2013
comment
@Homer_J Это приведет к тому, что jQuery введет обратный вызов ошибки, а не успех, поскольку код состояния больше не равен 200. - person Kevin B; 13.08.2013
comment
Спасибо вам обоим - просто интересно, куда это идет, а потом, как я все еще обрабатываю/отображаю любые возвращающиеся сообщения? - person Homer_J; 13.08.2013
comment
@Маркус, хорошо, это имеет немного больше смысла - будет ли это что-то вроде header: ('HTTP/1.1 503 Service Unavailable'); - будет ли это зафиксировано в разделе успеха или неудачи, хотя мне интересно? - person Homer_J; 13.08.2013
comment
Мне все еще неясно, как он может вернуть сообщение об ошибке PHP, если есть ошибка при отправке данных в базу данных. Я совершенно потерян на этом. - person Homer_J; 13.08.2013
comment
См. приведенное выше редактирование - оно по-прежнему не возвращает сообщение об ошибке. - person Homer_J; 13.08.2013
comment
@Markus - спасибо за ответ и обновленный ответ, к сожалению, сообщение об ошибке все еще не отображается. :-( - person Homer_J; 13.08.2013