1

データベースからデータを取得しようとすると、JavaScript が JSON を 2 回返します。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 倍を作成しています。SO 以下を取得する代わりに:

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

私は得ています:

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

毎回、2回呼び出されているようです。

また、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 呼び出しが適切なステータスをチェックしていません。見返りを求めているだけです。そのため、パケットを取得するたびに、匿名機能が開始されます。

コードをこれに変更すると、配列が 1 つだけ取得されるはずです

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

w3schoolsによるとonreadystatechange、変更のたびにイベントがトリガーされます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 に答える