Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在非对象上调用成员函数-PHP_Php_Mysql - Fatal编程技术网

在非对象上调用成员函数-PHP

在非对象上调用成员函数-PHP,php,mysql,Php,Mysql,是否有人可以显示、修复或告诉我为什么会出现此错误 对非对象调用成员函数getRating() 下面是函数 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='$mo

是否有人可以显示、修复或告诉我为什么会出现此错误

对非对象调用成员函数getRating()

下面是函数

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","");
    }

}
getRating($movie_id)
这就是我调用函数的方式

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","");
    }

}
getRating($movie_id)

有人能帮我吗,因为我是php新手。

在看不到其余代码的情况下,不清楚问题出在哪里,但似乎您正在为一个类实例化
$movie
,然后将
$movie
指定为数组。这不太好,因为数组
$movie
赋值只会删除类
$movie
赋值

我建议重命名类变量或数组。以下是重命名为
$movie\u数组的数组:

$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\u 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","");
    }
}
看起来像

$movie = $movie->getByPerma($perma,$language);
不返回对象,因此稍后在代码中调用

$movie['rating'] = $movie->getRating($movie['id']);
您正在对非对象调用函数。通过使用查看此行前面的$movie等于多少

var_dump($movie);
$movie=['rating'] = $movie->getRating($movie['id']);

但不确定,似乎是
$movie=$movie->getByPerma($perma,$language)未返回对象。尝试做
var\u转储($movie)

返回的不是对象的东西

所以我会

print_r($movie)
在第二行,看看我得到了什么

第二件事是:

$movie['rating'] = $movie->getRating($movie['id']);
在左侧使用$movie作为数组,在右侧使用它作为对象,然后再次发送使用$movie['id']作为数组的参数

因此:

如果要获取数组,则数组不能包含函数,该函数应位于类之外,并将按如下方式调用:

getRating($movie['id']) 
伊斯蒂德

$movie->getRating($movie['id']).
如果您正在获取一个对象,并且该对象实现了该函数

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","");
    }

}
getRating($movie_id)
然后,访问对象属性的方法是:

$movie->rating and $movie->id
我想这些财产是公开的。但这不是正确的方法。。。属性应该是私有的,您应该为对象属性实现getter和setter,如下所示:

 private $rating;
 public function get_rating()
{
  return $this->rating; 
}
$movie->set_rating($some_rating);
在这种情况下,要获得评级,请使用

 $movie->get_rating();
要为评级指定一个值,请执行

  public function set_rating($r)
  {
     $this->rating=$r; 
  }
和如下所示的符号值:

 private $rating;
 public function get_rating()
{
  return $this->rating; 
}
$movie->set_rating($some_rating);

不知道我是否帮了忙或让一切变得更混乱了:但是请随意问我问题:)

getByPerma
做了什么?你正在用一个数组覆盖你的
$movie
对象,这个数组也称为
$movie
,所以当你尝试调用
getRating()
时,你正在该数组上调用它,因此,错误“在非对象上”。所以只需将数组赋给另一个变量即可。@Graham:Comment应该是答案……对于一个简单的问题,这是最好/详细的答案之一+1来自我的程序员同事