Справочная информация: Я создаю приложение, использующее AJAX для получения массивов PHP, которые были закодированы в формат JSON для динамического построения таблиц.Я столкнулся с проблемой, хотя, как будто у меня нет ошибок компиляции, я не вижу массив во всплывающем окне JavaScript в качестве теста.
Ошибка: console.log ("result:"+ результат);в getArray в bookconf.js выводит квадратные скобки или Array () в зависимости от того, является ли переменная json_encoded или нет.
Желаемый эффект: Я бы хотел видеть запрашиваемый массив phpвывод в эквивалентном массиве javascript.
Структура приложения следующая:
- страница, получающая переменные формы POSTED, формирует массивы и затем кодирует их, php / processbookconf.php
страница, включая php / processbookconf.php и php / functions.php, называется bookconf.php
bookconf.php ссылки на js / bookconf.js с использованием тегов сценария
bookconf.js делает AJAX GET-запрос к php / ajaxjson.php
ajaxjson.php включает в себя php / processbookconf.php и php /функции, эхо-переменные из php / processbookconf.php
bookconf.php вызывает методы из bookconf.js
код
bookconf.php
<?php
session_start();
include('php/functions.php');
include('php/processbookconf.php');
$currentuser=getUserLevel();
?>
<!doctype html>
<html lang="en-gb" dir="ltr">
<head>
</head>
<body>
<section id ="main">
<div id ="myDynamicTable">
</div>
</section>
</body>
<script src="js/functions.js"></script>
<script src="js/bookconf.js"></script>
<script>
createTable();
</script>
</html>
processbookconf.php
pasfor = array();
$passur = array();
$pasage = array();
$pasjour = array();
$pascost = array();
for ($i =0; $i<$nopass;$i++){
$passforname = 'pasforname'.$i;
$passfornametest = $_POST[$passforname];
$pasfor[] = $passfornametest;
}
$pasforJSON=json_encode($pasfor);
//echo $pasforJSON;
bookconf.js
function getArray(seljson, callback){
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState===4){ //request done
console.log("request =4");
if(xmlhttp.status===200){//successfully
console.log("status=200");
var JSONresult = xmlhttp.responseText;
console.log(JSONresult);
callback(JSONresult);
console.log("after");
}else{console.log(xmlhttp.status);}
}
};
xmlhttp.open("GET","/~13011450/DWBA/php/ajaxjson.php?q="+seljson,true);
xmlhttp.send();
}
//result is callback argument which is result
getArray('forename',function(result){
console.log("result: " +result);
//window.alert(result);
});
ajaxjson.php
session_start();
include('functions.php');
$currentuser=getUserLevel();
include('processbookconf.php');
//echo $pasforJSON;
if(isset($_GET['q'])){
$q =$_REQUEST['q'];
if($q=='forename'){
//echo'test';
echo $pasforJSON;
}
/*switch($q){
case"forename":
echo $pasforJSON;
break;
}
*/
}
else{echo 'isnotset';}
Что я пробовал:
До текущей итерации я использовал более простую структуру функций AJAX.Это, однако, привело к логическим ошибкам, в частности, неопределенным ошибкам из-за асинхронных запросов.Я следовал руководству, изложенному в ответах на этот вопрос по stackoverflow Как мне вернуть ответ от асинхронного вызова , а также краткое руководство по функциям обратного вызова в codeburst Что за хрень это обратный вызов?? и у вас есть код и структура из обоих.
Обновление: после тестирования и редактирования предыдущей итерации, я действительно обнаружил ошибку в пути вверху phpФайл /ajaxjson.php, который включает файл функций.Упс.Это было найдено с помощью console.log и получило ошибку 500.Оттуда я получил ошибку, когда я использовал метод JSON.parse в xmlhttp.responseText.Когда я удалил это, я получил весь вывод bookconf.php в консоли.Это, я полагаю, было связано с тем, что страница php / ajaxjson.php включала bookconf.php для получения переменных и что страница включала HTML.Затем я разделил основной php-код в отдельный файл php / processbookconf.php, чтобы получить опубликованные переменные и выполнить тяжелую работу, в то время как bookconf.php мог просто включить его.Это позволило бы мне включить файл php / bookconf.php без возврата какого-либо HTML-кода в ответ AJAX. Я решил снова протестировать код PHP, чтобы убедиться в отсутствии проблем.Повторение указанных элементов массива, самого массива и закодированной версии массива дало правильный вывод, значения полей ввода с предыдущей страницы.Затем я проверил страницу php / ajaxjson.php, сделав ее код зависимым от получения значения, и эхо не установлено, если это не так.Поскольку он не возвращал этот оператор, я затем проверил запрос, повторив оператор, если полученное значение равнялось тому, которое было введено в функцию getArray на странице js / bookconf.js.Я получил возвращенное заявление.Внутри этого оператора if я попытался повторить переменную pasforJson и получил [].Затем я попробовал print_r на массиве pasfor и получил Array ().Мне кажется, что закодированный массив не «правильно» передается со страницы processbookconf.php. Второе обновление: Комментарий был на странице php / functions
Спасибо, что нашли время, чтобы прочитать это и помочь. Я был бы признателен, если бы ответы были в простом JavaScript, пожалуйста, никаких структур.Также, если бы вы могли сделать объяснения настолько простыми, насколько это возможно, поскольку я довольно неопытен в веб-разработке, это было бы очень ценно.С уважением.