У меня есть страница, которая выполняет 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.