【发布时间】: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