背景:我正在构建一个使用AJAX接收已编码为JSON格式以动态生成表的PHP数组的应用程序。尽管遇到了编译错误,但我还是遇到了麻烦,但我没有在JavaScript弹出窗口中看到该数组作为测试。
错误: console.log(“ result:” + result);在bookconf.js中的getArray中,根据变量是否经过json_encoded输出方括号或Array()。
期望的效果:我希望能够以相同的javascript数组看到php数组请求的输出。
应用程序的结构如下:
页面,包括名为bookconf.php的php / processbookconf.php和php / functions.php
bookconf.php使用脚本标签链接到js / bookconf.js
bookconf.js向php / ajaxjson.php发出AJAX GET请求
ajaxjson.php包括php / processbookconf.php和php / functions,从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 How do i return the response from an asynchronous call 的此问题的回答中列出的指南,以及有关代码突发What the heck is a callback?上的回调函数的简短教程,并从这两者中获取了紧凑的代码和结构。
更新:通过测试和编辑先前的迭代,我实际上确实在包含功能文件的php / ajaxjson.php文件顶部的路径中发现错误。哎呀使用console.log发现此错误,并显示500错误。当我在xmlhttp.responseText上使用JSON.parse方法时,从那里出现错误。当我删除它时,我在控制台中获得了整个bookconf.php文档输出。我认为,这是因为php / ajaxjson.php页面包含bookconf.php以获取变量,并且该页面包含HTML。然后,我将主要的php代码分离到一个名为php / processbookconf.php的单独文件中,以接收发布的变量并进行繁重的工作,而bookconf.php可以仅包含它。这将允许我包含php / bookconf.php文件而不在AJAX响应中返回任何HTML。我决定再次测试PHP代码以检查是否存在问题。与数组的指定元素相呼应,数组本身和数组的编码版本提供了正确的输出,即前一页的输入字段值。然后,我通过使php / ajaxjson.php页面的代码依赖于接收值来测试它,如果没有,则回显isnotset。因为它没有返回该语句,所以我随后通过回显一条语句来测试查询,如果接收到的值等于在js / bookconf.js页上的getArray函数中输入的值。我得到了回应的声明返回。然后在这个if语句中尝试回显pasforJson变量并得到[]。然后,我在pasfor数组上尝试了print_r并得到了Array()。在我看来,似乎没有从processbookconf.php页面正确“传递”编码数组。 第二次更新:该评论位于php /功能页面
感谢您抽出宝贵的时间阅读本文档并提供帮助。如果答案使用的是纯JavaScript语言,请不要使用任何框架,我将不胜感激。另外,如果您可以使解释尽可能简单,因为我对Web开发没有足够的经验,将不胜感激。亲切的问候。
答案 0 :(得分:0)
ajaxson.php文件中包含processbookconf.php会再次调用整个脚本,导致等于POSTED变量的变量的值为“”,因为没有内容发布到ajaxsjon.php。这是导致空数组的原因。
解决方案是在processbookconf.php中设置会话变量,然后使用json_encode方法调用它们,并在ajaxjson.php中回显结果。