Вызов функции из функции с массивами JSON - PullRequest
1 голос
/ 27 мая 2011

У меня есть функция A, которая загружает данные из базы данных, если пользователю понравилось изображение. У меня есть другая функция B, которая загружает счетчик для общего количества лайков за изображение. Обе эти функции возвращают ответ, используя JSON.

Если я вызываю их по отдельности, все работает нормально, но если я вызываю функцию B в функции A, я не получаю ответ JSON и ничего не происходит, хотя firebug показывает, что выводятся два массива JSON.

Что не так с кодом?

Функция A:

public function loadLikes() {
        //sql query

            try
            {


                $query = $this->_db->prepare($sql);
        $params = array(':imageid' => $imageid, ':author' => $author);
        $query->execute($params); 

                //calling function B
                $this->countLikes($imageid);

                if ($query->rowCount() > 0) {

                    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
                    if ($row['like'] == '1') {
                        $response = json_encode(array('like' => true));
                        echo $response;
                        return TRUE;
                    }
                    elseif ($row['like'] == '2')  {
                        $response = json_encode(array('unlike' => true));
                        echo $response;
                        return TRUE;
                    }
                    else {
                        $error = "Invalid";
                        $response = json_encode(array('like' => false, 'text' => $error));
                        echo $response;
                        return FALSE;
                    }
                  }

                }
                else {

                    $response = json_encode(array('unlike' => true));
                    echo $response;
                    return FALSE;
                }

            }
            catch(PDOException $ex)
            {
                echo json_encode(array('like' => false, 'text' => $ex));
                return FALSE;
            }

    }

Функция B:

public function countLikes($i) {
        //sql query

            try
            {           
                $query = $this->_db->prepare($sql);
                $params = array(':imageid' => $i);
                $query->execute($params); 

                if ($query->rowCount() > 0) {
                    $count = $query->fetchColumn();
                    $response = json_encode(array('count' => $count));
                    echo $response;
                    return TRUE;
                }


            }
            catch(PDOException $ex)
            {

                return FALSE;
            }

    }

JQuery:

$.ajax({
                            type: "POST",
                            url: url,
                            data: postData, 
                            dataType: "json",
                            success: function(data){
                                $(".count-like").show(600).text(data.count);
                                if(data.like) {
                                    $("a#alike").attr('class', 'starred');  
                                }
                                else if (data.unlike) {
                                    $("a#alike").attr('class', 'unlike');
                                }
                                else {
                                    alert(data.text);
                                }
                            }
                        });

1 Ответ

1 голос
/ 27 мая 2011

Если вы вызовете обе функции, то каждая из них выведет массив JSON.Это приведет к ответу HTTP со следующим содержанием:

{"like":1}{"count":2}

Оба массива будут действительны отдельно.Но если конкатенация подобна этой, она больше не является допустимым JSON.

Вместо вывода сериализации json с echo вы должны собрать его во временную переменную, объединить два массива, а затем вывести объединенный массив сsingle:

echo json_encode(array_merge($countArray, $likeArray));

Примером адаптации вашего кода

Функция B должна стать такой:

public function countLikes($i) {
    //sql query

        try
        {           
            $query = $this->_db->prepare($sql);
            $params = array(':imageid' => $i);
            $query->execute($params); 

            if ($query->rowCount() > 0) {
                $count = $query->fetchColumn();

                /* JUST RETURN HERE */
                return (array('count' => $count));
            }


        }
        catch(PDOException $ex)
        {

            /* INSTEAD OF FALSE use an empty array,
               which is interpreted as false in boolean context*/
            return array();
        }

}

Тогда при вызове функции:

//calling function B
$countArray = $this->countLikes($imageid);

Это всегда будет массив.Который вы затем можете использовать в выходном коде:

$response = json_encode(array('like' => true) + $countArray);

(Все еще нецелесообразно иметь echo прямо там. Но слишком много кода, слишком мало контекста, чтобы предложить более приятное переписывание. И если это работает, ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...