ajax返回单个变量和一个数组变量

时间:2014-11-19 06:40:41

标签: php jquery arrays ajax json

我有一个请求newtimestamp和newcomment变量的注释表单。 newtimestamp变量是单个变量,newcomment变量是从foreach循环返回的数组。

ajaxrequest.php:

foreach ($array2 as $print2) {
$var1 = $print2['var'];

$newtimestamp = $now;
$newcomment = "<div class=post>$var1</div>";


echo json_encode(array('newtimestamp' => $newtimestamp, 'newcomment' => $newcomment));
}

然后我使用ajax来添加新注释,并在隐藏的输入字段上设置newtimestamp。

AJAX:

<script>
 $(document).ready(function(){
 $('#commentform').on('submit',function(e) {

$.ajax({
    url:'ajaxrequest.php',
    data:$(this).serialize(),
    type:'POST',
    dataType: 'JSON',
    success:function(data, response){

$("#posts").fadeOut(300);                          
$("#posts").prepend(data.newcomment);
$("#time").val(data.newtimestamp);
$("#posts").fadeIn(500);
$('html, body').animate({ scrollTop: $('#posts').offset().top - 100 }, 'fast');     
        console.log(data);  

    },
    error:function(data){

                console.log(data);      
    }
    });

e.preventDefault();
return false;

});
});

上面的方法在控制台中给我一个成功的消息,prepend工作但每次只显示1个结果,它应该显示上一个时间戳的所有结果。如果用户发布第二个,第三个等注释,则前置和设置隐藏输入字段的值不起作用。

控制台:

Object {newtimestamp: "2014-11-19 07:59:48", newcomment: "<div>a new comment</div> 1"}
Object {readyState: 4, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function…}
Object {readyState: 4, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function…}

我需要将newtimestamp变量作为单个变量(不是数组)返回并将其设置为隐藏的输入字段值,并且我需要将newcomment变量作为可以添加到div的数组返回。

我该怎么做?

3 个答案:

答案 0 :(得分:0)

更改您的php文件。我不确定这是你在期待的。

ajaxrequest.php:

foreach ($array2 as $print2) {
$var1 = $print2['var'];

$newtimestamp[] = $now;
$newcomment[] = "<div class=post>$var1</div>";


}

echo json_encode(array('newtimestamp' => $newtimestamp, 'newcomment' => $newcomment));

答案 1 :(得分:0)

像这样重写你的php代码

$data = array();
foreach ($array2 as $print2) {
    $var1 = $print2['var'];

    $newtimestamp = $now;
    $newcomment = "<div class=post>$var1</div>";
    $data['data'][] = array('newtimestamp' => $newtimestamp, 'newcomment' => $newcomment);
}

echo json_encode($data);

现在JSON响应看起来像

{"data" : [{"newtimestamp" : 72345654,"newcomment" : "comment data"},{"newtimestamp" : 72345654,"newcomment" : "comment data"}]}

使用jQuery each循环遍历对象数组。最终的代码看起来像这样。

$.each($response.data,function(index,value){
    $("#posts").prepend(value.newcomment);
    $("#time").val(value.newtimestamp);
})

注意:要么发送application/json标头(以便在默认情况下解析响应并转换为js对象),要么在接收后解析它。此操作应在each循环

之前执行

答案 2 :(得分:0)

那是因为你回显了多个JSON字符串。您需要使用所有数据回显单个JSON字符串。

尝试类似下面的代码,这对我有用。您只需要将它放入您的jQuery和PHP代码中。

<?php
    $jsonArray = array();
    $array2 = array(array('var'=>1),array('var'=>2));
    foreach ($array2 as $print2) 
    {
        $var1 = $print2['var'];

        $newtimestamp = time();
        $newcomment = "<div class=post>$var1</div>";


        $jsonArray[] = array('newtimestamp' => $newtimestamp, 'newcomment' => $newcomment);
    }
    print_r($jsonArray);
    $data = json_encode($jsonArray);

?>

<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
<script>

    var data = jQuery.parseJSON('<?=$data?>');

    $.each(data, function(item, value){
        console.log(value['newtimestamp']);
    });
</script>