PDO rowCount () ошибка при вызове своего объекта из расширенных классов - PullRequest
3 голосов
/ 15 марта 2011

У меня есть класс базы данных, который я создал, который использует 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 ]

1 голос
/ 15 марта 2011

Измените ваш метод row_count на этот:

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;
}

Теперь вы хотя бы поймете, что не так.

0 голосов
/ 15 марта 2011

Ваш конструктор должен называться __construct(), а не __constructor(). Таким образом, ваш код, вероятно, завершится ошибкой при вызове родительского конструктора.

Кроме того, при сбое метода query () возвращается false вместо объекта, для которого вы можете вызвать rowcount (). Вам следует добавить проверку, чтобы убедиться, что запрос выполнен успешно.

0 голосов
/ 15 марта 2011

Этот фрагмент отсюда (http://php.net/manual/en/language.oop5.basic.php)

В чем разница между $ this и self?

Внутри определения класса $ this относится к текущему объекту,в то время как self ссылается на текущий класс.

Необходимо обратиться к элементу класса, используя self, и обратиться к элементу объекта, используя $ this.

Поэтому в вашей функции row_count(...) вы должны использовать $ this-> PDO-> query (...

[EDIT]

Вы можете попробовать объявить $ this-> db = null; у вашего ребенкаклассы, прежде чем вызывать конструкцию вашего родительского класса.

class MyOtherClassB extends MyClass
{
    public __construct()
    {
        $this->db = null;
        parent::__construct();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...