访问模型父对象中的对象

时间:2014-04-20 21:12:43

标签: php mysql oop pdo

我正在尝试调用我的Database类中的函数,但我似乎无法正确使用它。

我的Model类调用Database并将其分配给变量:

class Model {

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

    function __destruct() {
        $this->db = NULL;
    }

}

我试图通过以下方式调用它:

class User extends Controller {

    function __construct() {
        parent::__construct();
    }

    public function userExists($username) {
        return $this->model->db->select('users', 'id', 'email LIKE ?', array($username));
    }
}

但我一直收到错误:

Fatal error: Call to a member function select() on a non-object in C:\Apache24\htdocs\Manager 2014\controllers\User.php on line 10

我的数据库类是:

class Database extends PDO {

    function __construct($user = 'root', $pass = '', $database = 'xxx', $host = 'localhost') {
        try {
            parent::__construct('mysql:host=' . $host . ';dbname=' . $database, $user, $pass);
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
            $this->setAttribute(PDO::ATTR_PERSISTENT, FALSE);
            $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
            $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, FALSE);
            $this->exec("SET NAMES utf8");
        } catch (PDOException $e) {
            Database::handleDbError($e);
        }
    }

    public function select($table, $cols, $where = null, $whereVals = null, $order = null) {
        if ($this->tableExists($table)) {
            $PDOParams = array();
            $SQL = 'SELECT ' . $cols . ' FROM ' . $table;
            if ($where) {
                $SQL .= ' WHERE ' . $where;
            }
            if ($whereVals) {

            }
            if ($order) {
                $SQL .= 'ORDER BY ' . $order;
            }
            return $SQL;
        } else {

        }
    }

    public function tableExists($table) {
        $r = $this->PDO->prepare("SHOW TABLES LIKE ?");
        $r->execute(array($table));
        return $r->rowCount();
    }

}

我做错了什么?


如果我:

print_r(get_class_vars ('UserModel'));

从我得到的User类:

Array( [db] => )

这对我没有意义,因为在调用UserModel时正在调用的构造函数中,在Model中分配了它。


而不是我的Database类中的select(),我现在在我的主Model类中有以下内容:

public function get($primaryKeyId) {
    $table = str_replace('model', '', strtolower(get_called_class()));
    $SQL = "SELECT * FROM $table WHERE id = ?";
    $r = $this->db->prepare($SQL);
    $r->execute(array($primaryKeyId));
    return $r->fetch();
}

3 个答案:

答案 0 :(得分:1)

您的实施存在许多重要缺陷。

  1. 首先,摆脱select()功能

    • 非常不安全,允许原始变量进入查询
    • 它非常不灵活,只允许愚蠢的沙盒查询
    • 它使得几乎自然的SQL英语
    • 变得难以理解
  2. 其次,每次调用类时都不要创建新的数据库实例。即使是简单的应用程序也会使用大量连接来终止您的数据库服务器。

    • 将db作为参数传递给构造函数
  3. 从你的评论看来,错误处理程序方法不处理任何使它成为邪恶的东西

    • 如果您不知道如何处理错误 - 请放手。彻底摆脱这种尝试/捕捉的东西

答案 1 :(得分:0)

模型中的数据库对象需要是公共的,因此可以在Model类之外访问它。

class Model {

    public $db;

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

    function __destruct() {
        $this->db = NULL;
    }

}

有关public,protected和private之间区别的详细信息,请参阅object visibility

答案 2 :(得分:0)

我刚刚完成了AMP的自定义构建并忘记启用mysql PDO扩展...这就是数据库参数为空的原因 FACEPALM