Обработка ошибок в Ajax вызове (jQuery) не работает - PullRequest
1 голос
/ 04 мая 2020

Я использую jQuery и Ajax для передачи данных на страницу PHP / MySQLi. Код и запрос работают как задумано, но я не могу найти способ справиться с ошибками. Например Я хочу проинформировать пользователя о возможной повторяющейся записи, когда данные, которые я передаю на страницу PHP, уже существуют в моей базе данных (см. Комментарий в коде ниже).

Я пробовал разные подходы, но моя обработка ошибок всегда игнорируется или не применяется. Может кто-нибудь сказать мне, как это сделать правильно?

jQuery (сокращено):

$('#btnSave').on('click', function(e) {
    e.preventDefault();

    var vid = $.trim($('#vid').val());
    var vid2 = $.trim($('#vid2').val());
    var vid3 = $.trim($('#vid3').val());
    var mode = 'update';
        if(vid == 'new') {
            mode = 'insert';
        }

    $.ajax({
        type: 'POST',
        url: 'updateVid.php',
        data: {
            mode: mode,
            vstId: vstId, 
            vstId2: vstId2,
            vstId3: vstId3
        },
        success: function(result){
            alert('success');
        },
        error: function() {
            alert('error'); // I am unable to retrieve this in jQuery / Ajax resp. to do anything here
        }
    });
});

PHP / MySQLi (сокращено):

<?php   
    require_once 'me/config.php';

    $postData = $_POST; 
    $mode = $_POST['mode'];
    $vid = $_POST['vid'];
    $vid2 = $_POST['vid2'];
    $vid3 = $_POST['vid3'];

    $conn = new mysqli($host, $username, $password, $database);
    if($conn->connect_error) {
        die("Connection Error: " . $conn->connect_error);
    }   
    if($mode == 'update') {
        $stmt = $conn->prepare("UPDATE vids v SET v.vid2 = ?, v.vid3 = ? WHERE v.vid = ?");
        $stmt->bind_param("sss", $vid, $vid2, $vid3);
        $stmt->execute();
    } else {
        $vid = '99999999';
        $vid2 = '99XXX999';

        $stmt = $conn->prepare("SELECT vid2 FROM vids WHERE vid = ?");
        $stmt->bind_param("s", $vid);
        $stmt->execute();
        $stmt->store_result();

        if($stmt->num_rows > 0) {
            echo 'Error'; // I am unable to retrieve this in jQuery / Ajax
        } else {
            $stmt->close();

            $stmt = $conn->prepare("INSERT INTO vids (vsid, vid2, vid3) VALUES (?, ?, ?)");
            $stmt->bind_param("sss", $vid, $vid2, $vid3);  
            $stmt->execute();

            echo 'Success';
        }
    }

    $stmt->close();
    $conn->close(); 
?>

Большое спасибо заранее, Том

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Поскольку ваш AJAX звонок всегда успешен, вы не получите сбой. Если вызов AJAX не удастся, вы получите ошибку.

Ваш PHP может произойти сбой отдельно, но он не будет выдавать ошибку AJAX, поэтому, если вы хотите обработать PHP ошибки с AJAX, вы должны обработать их в функции успеха, но предоставив способ узнать PHP не удалось. Например:

success: function(result){
  if(result->message == 'fail') {
      // handle failure here
  } 
},

ТАКЖЕ

Пожалуйста, прекратите использовать alert() для устранения неполадок. , используйте console.log() вместо.

2 голосов
/ 04 мая 2020

Это все о кодах состояния HTTP. Функция jQuery success срабатывает, когда код состояния http был 200 / OK. Если возвращенный код состояния http был ошибочным, он вызывает функцию error. Зная, что вы должны отправить http коды состояния в заголовке ответа php.

Для этого, пожалуйста, взгляните на функцию php http_reponse_code () .

http_response_code(422);
echo json_encode($some_data);
exit();

Ваш вывод echo всегда является действительным выводом для jQuery. Вывод данных без кода состояния всегда означает состояние 200 / ОК. Как показано выше, вы можете установить возвращаемый статус с помощью PHP. Список кодов состояния HTTP отображается здесь .

...