Ajax отклоняет JSON, созданный PHP, с помощью «SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON» - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть страница, которая выполняет Ajax-вызов, который извлекает, JSON кодирует и возвращает данные из базы данных.Страница работала, но в процессе внесения некоторых изменений она теперь не работает.(Следует учесть, что я работаю с тестовым сайтом и тестовой базой данных, когда вносю изменения.)

Параметр errorThrown в случае ошибки показывает мне «SyntaxError: JSON.parse: неожиданный символ в столбце строки 11 из данных JSON. "

Вот функция с вызовом Ajax.(Я улучшил то, что в предупреждениях для целей отладки. Я разорву это, когда все заработает.)

function acceptConfCode(){
    var emailAddr = $('#email').val();
    var confCode = $('#confcode').val();
    var fnargs = "ConfirmCode|'" + emailAddr + "'," + confCode ;
    $.ajax({
        url: 'retrievedata.php',
        type: "POST",
        async: true,
        data: {"functionname":"confirmcode","arguments":fnargs},
        dataType: "JSON",
        success: function (obj) {
            if (!obj.error) {
                $('#logininfo').hide();
                $('#emailrow').hide();
                $('#coderow').hide();
                $('#reviewactions').show();

                updateListOfActions(obj);
            }
            else {
                success = false;
                alert("The confirmation code you entered didn't match or has expired. Please try again. Type 1");
            }                   
        },
        error: function(xhr, textStatus, errorThrown) {
            success = false;
            alert("The confirmation code you entered didn't match or has expired. Please try again. Type 2. textStatus = " + textStatus + "; errorThrown = " + errorThrown);
        }
    });
};

Страница PHP с восстановленными данными в основном представляет собой оператор CASE.Соответствующим случаем является следующее (снова с добавленным кодом отладки):

        case 'confirmcode':
            if ($argcount <2) {
                $returnval = 'too few arguments';
            }
            else {
                   $returnval = confirmcode($argsarray[0], $argsarray[1]);
                   echo "Back from confirmcode\r\n";
                   var_dump($returnval);
            }
            break;  

В конце страницы возвращается значение $ returnval.

Действие ключа выполняется в функции подтверждения кода, котораязапускает MySQL SP, чтобы подтвердить, что у пользователя есть действительный адрес электронной почты и код, а затем вызывает другую функцию для получения фактических данных.Вот код подтверждения.Как показывают закомментированные фрагменты, я проверил результаты по пути и получаю то, что ожидаю, и кодируется JSON;Я проверил закодированный JSON через JSON_decode () в тестировании, чтобы подтвердить, что он был декодируемым.

function confirmcode($spname, $params, $errorstring = 'Unable to send requested data') {
    $conn = connect2db();
    $query = "SELECT ".$spname."(".$params.") as result";
    //echo $query."\r\n";
    $result = mysqli_query($conn, $query);
    $allresult = "unknown";

    if (!$result) {
        $errmessage = mysqli_error($conn);
        $allresult = $errmessage;
        $allresult = json_encode($allresult);
        //echo $errmessage;
        die( print_r( mysql_error(), true));
    }
    else {
        //echo "In else case\r\n";
        //retrieve list of action submissions
        $resultobj = mysqli_fetch_object($result); 
        if ($resultobj->result == 1) {
            //echo "In success subcase\r\n";
            $allresult = getsubmissions($conn);
            //echo "After getsubmissions\r\n";
            //print_r($allresult);
        }
        else {
            //echo "In failure subcase\r\n";
            $result = array('error'=>true);
            $allresult = $result;
        }

    //echo "Before JSON encode\r\n";
     $finalresult = json_encode($allresult);
    //echo "After JSON encode\r\n";
    //echo json_last_error_msg()."\r\n";
    //var_dump($finalresult);
     $allresult = $finalresult;
    return $allresult;

    }

}

Наконец, вот что мы получаем, снова с некоторым кодом отладки:

function getsubmissions($conn) {
    echo "In getsubmissions\r\n";
    $query = "CALL GetSubmissions()";
    $submissions = mysqli_query($conn, $query);
    if (!$submissions) {
        echo "In failure case\r\n";
        $errmessage = mysqli_error($conn);
        $allresult = $errmessage;
        $allresult = json_encode($allresult);
        echo $errmessage;
        die( print_r( mysql_error(), true));
    }
    else {
        echo "In success case\r\n";
        $rows = array();
        while ($row = mysqli_fetch_assoc($submissions)) {
            $rows[] = $row;
        }
        $allresult = $rows; //json_encode($rows);
    }

    //print_r( $allresult);
    return $allresult;
}

Чтодействительно странно, что у меня есть другая страница на сайте, которая без проблем извлекает почти те же самые данные посредством вызова Ajax.Одно из них содержит несколько дополнительных полей и не содержит двух полей даты, которые приводят к этому результату.

Кроме того, действующая версия сайта получает те же данные, что и здесь, за исключениемживая база данных, а не тестовая база, и это работает.Хотя в этой версии кода есть некоторые дополнительные функции, единственными отличиями в соответствующих частях являются элементы отладки.(То есть я внес изменения, но не в той части, которую я показываю здесь.) Это наводит меня на мысль, что это может быть проблема с тестовыми данными, а не с кодом, но тогда почему другая страница работаетна тестовом сайте?

ОБНОВЛЕНИЕ: Чтобы выяснить, является ли это проблемой с данными, я сократил тестовые данные до такой степени, что он возвращает только пару записей.Я взял сгенерированный JSON и запустил его через JSONLint.COM, и он говорит, что он действителен.

ОБНОВЛЕНИЕ 2: с сокращенным набором данных, вот строка, которая возвращается из retrievedata.php к вызову Ajax:

[{"ActionSource":"https:\/\/www.voterheads.com\/","ActionSourceName":"Wall-of-us","Title":"Sign up to get notified about local meetings","Description":"Sign up at www.voterheads.com to get notified about local meetings. When we did, using the free option, this is what happened: a page popped up with a list of municipality meetings in the zip code we entered. We clicked on one of the meetings, and presto! -- instant access to the date, time, location, and agenda of the meeting. Pretty awesome.","StartDate":null,"EndDate":null,"UrgencyDesc":"Anytime","UrgencyColor":"#00FF00","UrgOrder":"5","DurationDesc":"Ongoing","DurOrder":"6","CostDesc":"Free","CostOrder":"1","Issues":"Advocacy","Types":"Learn","States":"ALL","iID":"20"},{"ActionSource":"https:\/\/actionnetwork.org\/forms\/ctrl-alt-right-delete-newsletter-2","ActionSourceName":"Ctrl Alt Right Delete","Title":"Sign up to learn what the \"alt-right\" is up to","Description":"Understand how the right operates online. Sign up for a weekly newsletter.","StartDate":null,"EndDate":null,"UrgencyDesc":"Anytime","UrgencyColor":"#00FF00","UrgOrder":"5","DurationDesc":"An hour or less","DurOrder":"2","CostDesc":"Free","CostOrder":"1","Issues":"Advocacy","Types":"Learn","States":"ALL","iID":"25"}]

Как отмечено выше, JSONLint.COM говорит, что это допустимый JSON.

1 Ответ

0 голосов
/ 26 февраля 2019

Я нашел решение, хотя я только начинаю понимать, почему оно работает.На retrievedata.php я раскомментировал:

echo $returnval;

непосредственно перед оператором Return, и он снова работает.Поэтому я думаю, что проблема в том, что так как retrievedata является страницей, а не функцией, оператор return фактически ничего не возвращал.Мне нужен был код, чтобы фактически вернуть строку в кодировке JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...