首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON返回副本

问JSON返回副本
EN

Stack Overflow用户
提问于 2013-11-08 01:33:50
回答 3查看 899关注 0票数 1

当我试图从数据库中提取数据时,我的javascript将两次返回JSON。为什么我的JSON会以这种方式返回?

PHP:

代码语言:javascript
复制
<?php
require ('functions.inc');
dbconn(); //establish my db connection
mysql_selectdb("acts");
$query = mysql_query("SELECT * from actInfo");
while ($row = mysql_fetch_assoc($query)){
     $name = $row[ActName];
}
$json=json_encode($name);
echo $json;
?>

Javascript:

代码语言:javascript
复制
function getActNames(){
if (windows.XMLHttpRequest)
{
     xmlhttp=new XMLHttpRequest();
}
else
{
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
     var json = xmlhttp.responseText;
     var parseV = JSON.parse(json);
     $("#somediv").append(parseV);
}
xmlhttp.open("POST","PHP/actMgmt.php",true);
xmlhttp.send();
}

我在HTML中通过以下方式调用它:

代码语言:javascript
复制
<p class = "button" onclick= "getActNames();return false;">Some Button </p>

我的JSON调用正在创建2倍请求的记录。因此,与其得到以下内容:

代码语言:javascript
复制
["act1","act2","act3"]

我得到了:

代码语言:javascript
复制
["act1,"act2","act3"]["act1","act2","act3"]

好像每次都叫两次。

另外,当我转到PHP页面时,它只返回如下内容,就像我期望的那样:

代码语言:javascript
复制
["act1","act2","act3"]

**编辑

var_dump($name)输出:=>{ =>string(4)"act1“1=> string(4)"act2”2=> string(4)"act3"}

**编辑

console.log(xmlhttp.responseText)给了我:

代码语言:javascript
复制
JSON.parse: unexpected end of data
["act1","act2","act3"]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-08 01:53:39

我现在看到了。将来,我会强烈建议您使用像jQuery这样的框架来避免这种情况。编写自己的AJAX函数往往会导致类似的问题。AJAX调用没有检查是否有适当的状态。它只是在寻找任何回报。因此,每次您收到一个数据包时,它都会启动您的匿名函数。

将代码更改为此,您应该只获得一个数组。

代码语言:javascript
复制
xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
     var json = xmlhttp.responseText;
     var parseV = JSON.parse(json);
     $("#somediv").append(parseV);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-11-08 01:40:14

这是由于同一个页面上有多个ajax调用(您可以观察到这可能在第一次运行时发生),所以不是一个解决方案,但是您仍然可以通过创建单独的php和html(包含ajax)页面逃离当前的场景,

票数 0
EN

Stack Overflow用户

发布于 2013-11-08 02:13:42

根据w3schools,每次readyState更改时都会触发onreadystatechange事件。

这意味着在每个请求周期中,它被多次调用,并附带可能的选项:

代码语言:javascript
复制
0: request not initialized 
1: server connection established
2: request received 
3: processing request 
4: request finished and response is ready

所以你需要做的是:

代码语言:javascript
复制
function getActNames() {
    if (windows.XMLHttpRequest) {
         xmlhttp=new XMLHttpRequest();
    }
    else {
         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function() {
        // Called when the request finished successfully and response is ready.
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
             var json = xmlhttp.responseText;
             var parseV = JSON.parse(json);
             $("#somediv").append(parseV);
        }
    }

    xmlhttp.open("POST","PHP/actMgmt.php",true);
    xmlhttp.send();
}

考虑到您使用的是jQuery,我强烈建议您使用jQuery ajax,如下所示:

代码语言:javascript
复制
$.post("PHP/actMgmt.php", { pram1: "value1" }, function( data ) {
    $("#somediv").append(data);
}, "json");

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19850060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档