静态方法调用mysql查询的结果

时间:2012-10-27 13:02:21

标签: php mysql oop

我有

class Check
{
    public function __construct()
    {
        $this->db = new Database();
    }

    public function query()
    {
        $login = Session::get("login");
        $sth = $this->db->prepare('SELECT admin FROM accounts WHERE login=:login');
        $sth->execute(array(':login' => $login));
        $result = $sth->fetch(PDO::FETCH_NUM);
        return $result[0];
    }

    public static function admin()
    {
        echo self::query();
    }
}

我在另一个有PDO连接的地方有数据库类。

class Database extends PDO
{
    public function __construct()
    {
        parent::__construct('mysql:host=localhost;dbname=name','root','pass');
        $this->query('SET NAMES utf8');
    }
}

所以在Check :: admin()代码之后我得到错误:

  

未定义的属性:View :: $ db

为什么?

2 个答案:

答案 0 :(得分:6)

您使用的static方法想要使用instance变量。

您的管理方法调用查询方法,查询方法使用db实例变量。由于您的类未实例化,db变量不存在。

我的建议是让管理方法不是静态的,并使用你的代码:

$mycheck = new Check();
$mycheck->admin();

或者,如果您使用的是PHP 5.4并希望坚持使用oneliner:

(new Check())->admin();

<强>更新

注意:不要在构造函数中创建db类,而是将其注入:

public function __construct(Database $db)
{
   $this->db = $db;
}

答案 1 :(得分:1)

很抱歉,这不是您问题的直接答案,但您的代码存在一些问题,因此需要花些时间检查并询问是否对您不清楚。

<?php

class Check {
    protected $_db;

    public function __construct(Database $db) {
        $this->_db = $db;
    }

    public function query(ISession $sessionData) {
        //WHY IS THE SESSION STATIC?
        //$login = Session::get("login");
        $sth = $this->_db->Connection()->prepare('SELECT admin FROM accounts WHERE login=:login');
        $sth->execute(array(':login' => $sessionData->get("login")));
        $result = $sth->fetch(PDO::FETCH_NUM);
        return $result[0];
    }

    public function admin(ISession $sessionData) {
        // REALLY BAD TO ECHO HERE
        echo $this->query($sessionData);
    }
}

class Database {

    private $_name;
    private $_password;
    private $_connStr;
    private $_settings;

    private $_pdo;

    public function __construct($connstr, $name, $password, array $settings = array()) {
        $this->_name = $name;
        $this->_password = $password;
        $this->_connStr = $connstr;
        $this->_settings = $settings;
    }

    public function Connection() {
        if ($this->_pdo == NULL) {
            $this->_pdo = new PDO($this->_connStr, $this->_name, $this->_password);
        }

        return $this->_pdo;
    }

    /* other fancy methods */

    public function Close() {
        $this->_pdo = NULL;
    }

    public function __destruct() {
        $this->Close();
    }
}

我不明白为什么你需要一个Check类来解决这个问题,如果我是你,我会创建像这样的东西:

$currentSession = Session::GetCurrent();
$currentSession->User()->IsInRole('admin');

请注意,会话不是静态的,如果我要编写更完整的解决方案,我会避免调用Session :: GetCurrent()因为当前会话将是某个类实例中的字段(例如HttpApplication)。