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