如何解决在具有JSON数组的函数中调用函数
| 我有一个函数A,如果用户喜欢该图像,它将从db加载数据。我有另一个函数B,它加载图像的喜欢总数的计数。这两个函数都使用JSON返回响应。 如果我分别调用它们,则一切正常,但是,如果我在函数A中调用函数B,则不会得到JSON响应,尽管萤火虫确实显示正在输出两个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);
}
}
});
解决方法
如果您同时调用这两个函数,则每个函数都会输出一个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
。但是代码太多,上下文太少,无法提出更好的重写。如果可行,..)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。