在具有JSON数组的函数中调用函数

时间:2011-05-27 15:14:53

标签: php jquery function

我有一个函数A,如果用户喜欢图像,它会从db加载数据。我有另一个函数B,它加载图像的总数。这两个函数都使用JSON返回响应。

如果我单独调用它们,一切正常,但如果我在函数A中调用函数B,我没有得到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 个答案:

答案 0 :(得分:1)

如果调用这两个函数,则每个函数都会输出一个JSON数组。这将导致HTTP响应,其中包含以下内容:

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

两个数组都是单独有效的。但如果像这样连接,它就不再是有效的JSON。

不是使用echo输出json序列化,而是应该在临时变量中收集它,合并两个数组,然后用单个数组输出组合数组:

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仍然是不可取的。但是代码太多,上下文太少而无法提出更好的重写。如果有效,那么......)