我正在尝试调用我的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();
}
答案 0 :(得分:1)
您的实施存在许多重要缺陷。
首先,摆脱select()
功能
其次,每次调用类时都不要创建新的数据库实例。即使是简单的应用程序也会使用大量连接来终止您的数据库服务器。
从你的评论看来,错误处理程序方法不处理任何使它成为邪恶的东西
答案 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 。