Почему я получаю ошибку синтаксического анализа json во время вызова ajax после обновления до Codeigniter 3.x? - PullRequest
0 голосов
/ 24 февраля 2020

Я обновляю мою платформу Codeigniter с 2.2.6 до 3.0.6. Она сломала существующий код, который работал раньше. В частности, я получаю сообщение об ошибке "SyntaxError: JSON.parse: unexpected character at line 2 column 1 of the JSON data" inside the browser console. Я попытался посмотреть и проверить, является ли это известной проблемой при обновлении, но я не видел, чтобы кто-то еще испытывал это.

Вот javascript, который я Я использую:

    $('#addServiceItem').on('change', function() {
        var serviceID = $(this).val();
        $.ajax({
            url: '/ajax/get_service_details/' + serviceID,
        }).done(function(data) {
            if (data.status == 'success') {
                addServiceItem(data.service);
            } else {
                alert(data.message);
            }
        });
    });

Кроме того, вот функция, которая вызывается в ajax url:

public function get_service_details($serviceID = 0)
    {
        if (!$this->input->is_ajax_request()) {
            exit('No direct script access allowed');
        }

        if ($serviceID == 0) {
            header('Content-type: application/json');
            echo json_encode(array(
                'status' => 'error',
                'service' => null,
                'message' => 'We could not find the service.'
            ));
        }

        $service = $this->services_model->get_service_details($serviceID);

        header('Content-type: application/json');
        echo json_encode(array(
            'status' => 'success',
            'service' => $service,
            'message' => ''
        ));
    }

Как указано выше, этот код работал в предыдущей версии Codeigniter. Насколько я могу судить, существует проблема с вызовом Ajax, возвращающим значение. В переменной javascript данные остаются неопределенными. Я предполагаю, что есть синтаксический стандарт, который изменился.

1 Ответ

0 голосов
/ 25 февраля 2020

Если ваш $serviceID == 0, то вы получите ошибку Headers already sent, потому что внутри IF вы выводите контент и не завершаете код, а вне IF вы снова пытаетесь установить заголовок.

Измените свой код на этот один:

public function get_service_details($serviceID = 0)
{
    if (!$this->input->is_ajax_request()) {
        exit('No direct script access allowed');
    }

    if ($serviceID == 0) {
        header('Content-type: application/json');
        echo json_encode(array(
            'status' => 'error',
            'service' => null,
            'message' => 'We could not find the service.'
        ));

        // Terminate function execution
        return;
    }

    $service = $this->services_model->get_service_details($serviceID);

    header('Content-type: application/json');
    echo json_encode(array(
        'status' => 'success',
        'service' => $service,
        'message' => ''
    ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...