1

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

PHP:

<?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:

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 中调用它:

<p class = "button" onclick= "getActNames();return false;">Some Button </p>

我的 JSON 调用正在创建 2 倍的请求记录。所以而不是得到以下内容:

["act1","act2","act3"]

我正进入(状态:

["act1,"act2","act3"]["act1","act2","act3"]

似乎每次都被调用两次。

另外,当我只是去 PHP 页面时,它只返回我期望的以下内容:

["act1","act2","act3"]

**编辑

var_dump($name) 输出:array(6)=>{ [0]=>string(4)"act1" [1]=> string(4)"act2" [2]=> string(4)"act3" }

**编辑

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

JSON.parse: unexpected end of data
["act1","act2","act3"]
4

3 回答 3

1

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

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

xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
     var json = xmlhttp.responseText;
     var parseV = JSON.parse(json);
     $("#somediv").append(parseV);
    }
}
于 2013-11-08T01:53:39.530 回答
0

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

于 2013-11-08T01:40:14.107 回答
0

根据w3schoolsonreadystatechange ,每次readyState更改都会触发该事件。

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

0: request not initialized 
1: server connection established
2: request received 
3: processing request 
4: request finished and response is ready

所以你需要做的是:

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,如下所示:

$.post("PHP/actMgmt.php", { pram1: "value1" }, function( data ) {
    $("#somediv").append(data);
}, "json");

希望这可以帮助。

于 2013-11-08T02:13:42.353 回答