有人可以展示,修复或告诉我为什么会收到此错误
Call to a member function getRating() on a non-object
这是函数
public function getRating($movieid){
$movieid = mysql_real_escape_string($movieid);
$average = 0;
$e = mysql_query("SELECT AVG(`rating`) as average FROM movie_ratings WHERE movieid='$movieid'") or die(mysql_error());
if (mysql_num_rows($e)>0){
extract(mysql_fetch_array($e));
}
return $average;
}
这就是我调用函数的方式
$movie = $movie->getByPerma($perma,$language);
if (empty($movie)){
$movie = '';
} else {
$movie['rating'] = $movie->getRating($movie['id']);
$tags = $movie->getMovieCategoryDetails($movie['id'],$language);
if (count($tags)){
$smarty->assign("tags",$tags);
} else {
$smarty->assign("tags","");
}
}
有人可以帮助我,因为我是php的新手。
答案 0 :(得分:1)
在没有看到其余代码的情况下,不清楚问题是什么,但似乎您正在为一个类实例化$movie
,然后将$movie
指定为数组。这可能不太好,因为数组$movie
赋值只会消除类$movie
赋值。
我建议重命名类变量或数组。这是重命名为$movie_array
的数组:
$movie_array = $movie->getByPerma($perma,$language);
if (empty($movie_array)){
$movie_array = '';
} else {
$movie_array['rating'] = $movie->getRating($movie_array['id']);
$tags = $movie->getMovieCategoryDetails($movie_array['id'], $language);
if (count($tags)){
$smarty->assign("tags", $tags);
} else {
$smarty->assign("tags","");
}
}
这里重命名的是$movie_class
:
$movie = $movie_class->getByPerma($perma,$language);
if (empty($movie)){
$movie = '';
} else {
$movie['rating'] = $movie_class->getRating($movie['id']);
$tags = $movie_class->getMovieCategoryDetails($movie['id'], $language);
if (count($tags)){
$smarty->assign("tags", $tags);
} else {
$smarty->assign("tags","");
}
}
答案 1 :(得分:1)
看起来像是
$movie = $movie->getByPerma($perma,$language);
没有返回一个对象,因此稍后在代码中调用
$movie['rating'] = $movie->getRating($movie['id']);
您正在调用非对象上的函数。使用
检查此行之前$ movie等于什么var_dump($movie);
$movie=['rating'] = $movie->getRating($movie['id']);
答案 2 :(得分:1)
$movie->getByPerma($perma,$language);
返回的东西不是对象。
所以我会
print_r($movie)
在第2行,看看我得到了什么。
第二个奇怪的事情是:
$movie['rating'] = $movie->getRating($movie['id']);
在左侧,您使用$ movie作为数组,在右侧,您将其用作对象,然后再次将您使用$ movie ['id']的参数作为数组发送。
所以:
如果你得到一个数组,数组不能有函数,那么函数应该在一个类之外,并且会像这样被调用:
getRating($movie['id'])
而不是
$movie->getRating($movie['id']).
如果您正在获取对象,并且该对象实现了该功能
getRating($movie_id)
然后访问对象属性的方法是:
$movie->rating and $movie->id
我认为这些属性是公开的。这不是正确的方法...虽然属性应该是私有的,你应该为对象属性实现getter和setter,如下所示:
private $rating;
public function get_rating()
{
return $this->rating;
}
在这种情况下,要获得评级,请使用
$movie->get_rating();
要将值赋予评级,请执行
public function set_rating($r)
{
$this->rating=$r;
}
像这样的asign值:
$movie->set_rating($some_rating);
Dunno,如果我帮助或使一切更令人困惑:S但随时问我问题:)
答案 3 :(得分:0)
不确定,好像$movie = $movie->getByPerma($perma,$language);
似乎没有返回一个对象。尝试var_dump($movie);