阵列未显示在控制台中

时间:2019-02-25 19:08:22

标签: javascript php arrays json ajax

背景:我正在构建一个使用AJAX接收已编码为JSON格式以动态生成表的PHP数组的应用程序。尽管遇到了编译错误,但我还是遇到了麻烦,但我没有在JavaScript弹出窗口中看到该数组作为测试。

错误: console.log(“ result:” + result);在bookconf.js中的getArray中,根据变量是否经过json_encoded输出方括号或Array()。

期望的效果:我希望能够以相同的javascript数组看到php数组请求的输出。

应用程序的结构如下:

  • 一个页面,该页面接收POSTED表单变量,形成数组,然后对其进行编码,php / processbookconf.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开发没有足够的经验,将不胜感激。亲切的问候。

1 个答案:

答案 0 :(得分:0)

ajaxson.php文件中包含processbookconf.php会再次调用整个脚本,导致等于POSTED变量的变量的值为“”,因为没有内容发布到ajaxsjon.php。这是导致空数组的原因。

解决方案是在processbookconf.php中设置会话变量,然后使用json_encode方法调用它们,并在ajaxjson.php中回显结果。