JQuery AJAX, как использовать массив объектов? - PullRequest
4 голосов
/ 01 ноября 2011

Итак, у меня есть два файла: index.php и query.php.

Проблема в том, что я не знаю, как использовать массив (msg.d), полученный ajax. Вывод моего массива:

{"s":0,"d":[{"userPostID":"1","userID":"1","postID":"1","choice":"1"},{"userPostI‌​D":"2","userID":"1","postID":"2","choice":"0"},{"userPostID":"3","userID":"1","pos‌​tID":"3","choice":"1"}]}

Что я хочу сделать, так это перебрать массив так, чтобы

while (i < array.length){ 
      if (msg.d[i]['choice'] = 1) {
           //do something with msg.d[i]['postID']
      } else if (msg.d[i]['choice'] = 0) {
           //do something else with msg.d[i]['postID']
      }
      i++
}

Я никогда раньше не работал с массивами объектов и из того, что я могу собрать, то, что я пытаюсь сделать, довольно сложно, и я не могу понять примеры, которые я нахожу.

index.php

<script type="text/javascript">
$(document).ready(function() {
// set $checked values

    $.ajax({
        url: 'query.php',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        cache: false,
        success: function (msg) {
                console.log(msg);
                },
        error: function (x, e) {
            alert("The call to the server side failed.");
        }
    });
});
</script>

<?php
$data = mysql_query("SELECT * FROM Posts LEFT JOIN userPosts ON Posts.postID = userPosts.postID AND userPosts.userID = $userID") or die(mysql_error());

while($row = mysql_fetch_array( $data )){
?>

query.php

<?php

$query = mysql_query("SELECT * FROM userPosts WHERE userPosts.userID = $userID") or die(mysql_error());

if (mysql_num_rows($query) == 0)
{
echo 'error';
}
else
{

echo json_encode(mysql_fetch_assoc($query));
}
?>

Я знаю, я близко ... Там нет ошибок!

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Я думаю, что вы хотите, чтобы получить весь набор записей в массив, а затем передать его в виде JSON клиенту. Прямо сейчас вы звоните mysql_fetch_assoc только один раз. Это означает, что вы получите только первый ряд.

То, как я бы это настроил, выглядит примерно так ( Примечание - я не проверял этот код):

query.php

<?php
$query = mysql_query("SELECT * FROM userPosts WHERE userPosts.userID = $userID");

// Return array contents:
// s = Status value, d = Data
// s == 0 -> Success
// s == 1 -> Error
// s == 2 -> No rows returned
$rtrn = array('s' => 1, 'd' => array());
//Check for error
if (mysql_errno() == 0) {
    //Check for no rows returned
    if (mysql_num_rows($query) == 0) {
        $rtrn['s'] = 2;
    } else {
        //Set status value to 0
        $rtrn['s'] = 0;
        //Get all rows from the query
        while($row = mysql_fetch_array($query)){
            //Append row to the data array
            $rtrn['d'][] = $row;
        }
    }
}
//Echo the return array
echo json_encode($rtrn);
?>

index.php (только обратный вызов)

success: function (msg) {
    if (msg.s == 0) {
        //Loop through returned data array using: msg.d
        //For example: msg.d[0] is the first row.
    } else if (msg.s == 2) {
        alert('No rows returned!');
    } else {
        alert('Error!');
    }
},

По сути, я делаю так, чтобы объект JSON всегда возвращался даже во время ошибки. Этот объект имеет часть состояния, поэтому вы знаете, что произошло, и часть данных, чтобы вы могли возвращать информацию. Для статуса ноль - это всегда успех, а один - всегда ошибка, но вы можете использовать другие числа для разных результатов, например, никаких возвращаемых записей. Это позволяет сделать ваше приложение намного более надежным.

Дайте мне знать, если что-то из этого не работает должным образом, поскольку, как я уже сказал, я не проверял это.

0 голосов
/ 06 ноября 2011

Я понял это!

<script type="text/javascript">
$(document).ready(function() {
// set $checked values

    $.ajax({
        url: 'query.php',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        cache: false,
        success: function (msg) {
                if (msg.s == 0) {
                    //Loop through returned data array using: msg.d
                    for (var key in msg.d) {
                        var obj = msg.d[key];
                        for (var prop in obj) {
                            if (prop == "postID"){
                                if (obj['choice'] == 1){
                                //do something with liked posts.
                                } else if (obj['choice'] == 0){
                                //do something with disliked posts.
                                }
                            }
                        }
                    }
                } else if (msg.s == 2) {
                    alert('No rows returned!');
                } else {
                    alert('Error!');
                }
            },
        });
    });
</script>
0 голосов
/ 01 ноября 2011

Попробуйте что-то вроде этого:

Вам нужно проанализировать ответ при успехе http://api.jquery.com/jQuery.parseJSON/

и затем просмотреть его http://api.jquery.com/jQuery.each/

$.ajax(
        {
            type: "POST",
            url: 'query.php',
            data: 'userID=' + userID,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            success: function (msg) {
                var obj = $.parseJSON(msg);
                    $.each(obj, function(i, val) {
                        alert(JSON.stringify(val));
                    });
            },
            error: function (x, e) {
                alert("The call to the server side failed.");
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...