从扩展类调用其对象时出现PDO rowCount()错误

时间:2011-03-15 17:10:45

标签: php pdo

我有一个使用PDO连接到我的查询的数据库类,我在主类构造函数中将其作为对象调用。

class MyClass
{
    protected $db;

    public __constructor()
    {
        $this->db = new Database();
    }
}
class Themes extends MyClass
{
    public $avatar;
    public $theme_name;
    public $theme_by;
    public $theme_by_email;
    public $theme_by_website;
    public $theme_description;
    public $theme_thumb;
    public $theme_source;
    public $theme_css;
    public $theme_js;
    public $theme_uploaded_on;

    public function __construct()
    {
        parent::__construct();
        $this->get_theme();
        $this->get_avatar();
    }

    public function get_theme()
    {
        $sql = "SELECT *
                FROM `user_themes`
                WHERE `user_id` = " . $this->session->get('user_id');
        if($this->db->row_count($sql))
        {
            $result                  = $this->db->fetch_row_assoc($sql);
            $this->theme_name        = $result['theme_name'];
            $this->theme_by          = $result['theme_by'];
            $this->theme_by_email    = $result['theme_by_email'];
            $this->theme_by_website  = $result['theme_by_website'];
            $this->theme_description = $result['theme_description'];
            $this->theme_source      = $result['theme_source'];
            $this->theme_css         = $result['theme_css'];
            $this->theme_js          = $result['theme_js'];
            $this->theme_uploaded_on = $result['theme_uploaded_on'];
        }else{
            die('no results');
        }
    }
}

我的问题是,如果我包含调用MyClass构造函数的扩展类,那么我会收到此错误:

Fatal error: Call to a member function rowCount() on a non-object in db.class.php on line 98

指向我的db.class.php中的这一行

class Database {

    private static $PDO;
    private static $config;

    public function __construct() {

        if (!extension_loaded('pdo'))
            die('The PDO extension is required.');

        self::$config = config_load('database');

        self::connect();

    }
...
    public function row_count($statement)
    {
        return self::$PDO->query($statement)->rowCount(); //Line 98
    }
}

如果我从扩展类中注释掉parent :: __ construct()那么我没问题就没有错误。

在FireFox,Chrom,Opera和Safari中试用我的网站

http://www.helixagent.com

我似乎在Firefox 3.6中没问题,但所有其他浏览器都让我误解了我提到的错误......

3 个答案:

答案 0 :(得分:1)

将row_count-method更改为:

public function row_count($statement)
{
  self::$PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  try {
    $stmt = self::$PDO->query($statement); 
    $result = $stmt->rowCount();
    return $result;
  } catch (PDOException $e) { echo $e->getMessage(); }

    return false;
}

现在你至少可以知道出了什么问题。

答案 1 :(得分:0)

此摘录来自此处(http://php.net/manual/en/language.oop5.basic.php

  

$ this和self之间的区别是什么?

     

在类定义中,$ this引用当前对象,而self引用当前类。

     

有必要使用self引用类元素,并使用$ this引用对象元素。

因此,在您的函数row_count(...)中,您应该使用$ this-> PDO->查询(...

[编辑]

您可以尝试声明$ this-> db = null;在调用父类构造之前,在子类中。

class MyOtherClassB extends MyClass
{
    public __construct()
    {
        $this->db = null;
        parent::__construct();
    }

答案 2 :(得分:0)

您的构造函数应该调用__construct(),而不是__constructor()。因此,在调用父构造函数时,您的代码可能会失败。

此外,当query() - 方法失败时,返回false而不是可以在其上调用rowcount()的对象。您应该添加一个检查以查看查询是否成功。