【问题标题】:Array not showing in console数组未显示在控制台中
【发布时间】:2019-02-25 19:08:22
【问题描述】:

背景: 我正在构建一个应用程序,它使用 AJAX 接收已编码为 JSON 格式的 PHP 数组以动态构建表。我遇到了一个障碍,虽然我没有编译错误,但我没有在 JavaScript 弹出窗口中看到数组作为测试。

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

预期效果:我希望能够在等效的 javascript 数组中看到 php 数组请求的输出。

应用程序的结构如下:

  • 接收 POSTED 表单变量、形成数组然后对其进行编码的页面,php/processbookconf.php
  • 页面包括 php/processbookconf.php 和 php/functions.php 称为 bookconf.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 上对这个问题的回答中列出的指南以及 codeburst 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/functions页面

感谢您花时间阅读本文并提供帮助。如果答案是纯 JavaScript 的,我将不胜感激,请不要使用框架。此外,如果您可以尽可能简单地解释,因为我对 Web 开发非常缺乏经验,我们将不胜感激。亲切的问候。

【问题讨论】:

  • 错误到底发生在哪里?您能与我们分享一个实际的例外情况吗?
  • 你已经告诉了我们很多事情,除了真正的问题是什么。
  • 另外,我认为你不能像在 bookconf.php 中那样在你的 php 中执行 Javascript。
  • 我已更新问题以包含该问题。我很抱歉。如前所述,问题是我认为我应该查看一个弹出窗口,显示 AJAX 请求的 JSON 对象已解码,但我根本看不到弹出窗口。 @JasonPelletier 你指的是当我调用 getArray 函数时?
  • 是的,你不能这样执行js。您也许可以使用它来评估它然后执行:php.net/manual/en/book.v8js.php

标签: javascript php arrays json ajax


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多