试图从模型到视图获取数据时,我遇到了以下错误:试图获取非对象和未定义变量的属性


Trying to get data from Model to View and i get these errors: Trying to get property of non-object and Undefined variable

我正在尝试创建一个基本的MVC"框架",但在将数据从模型获取到视图时遇到了一些问题。

class Controller
{
    public $_database = null;
    public $_model = null;
    public function __construct()
    {
        $this->connect();
    }
    private function connect()
    {
        $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING);
        $this->_database = new PDO(DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET, DB_USER, DB_PASS, $options);
    }
    public function model($model)
    {
        require_once '../app/models/'. $model .'.php';
        return new $model($this->_database);
    }
    public function view($view)
    {
        require '../app/views/'. $view .'.php';
    }
}

class Contact extends Controller
{
    public function index()
    {
        $name = 'David';
        $this->view('contact/index');
    }

首先,我的视图函数(在Controller.php中)无法正常工作:

通过"contact/index.php"视图中的echo$name,我得到了以下错误:未定义变量:name

如果我只是调用require'/app/views/contact/index.php'在contact控制器中,index方法工作得很好,但通过从controller调用view方法,我得到了这个错误。

第二个问题是我无法正确地从模型中获取数据

class User
{
    public $_database;
    public function __construct($database)
    {
        try 
        {
            $this->_database = $database;
        } 
        catch (PDOException $e) 
        {
            exit('Database connection could not be established.');
        }
    }
    public function select()
    {
        $stmt = "SELECT * FROM users WHERE ID = :id";
        $query = $this->_database->prepare($stmt);
        $query->execute(array(':id' => 1));
        return $query->fetchAll(PDO::FETCH_OBJ);
    }
}

通过调用$name=$this->model("User")->在Contact Controller中选择,并在"Contact/index"视图中调用echo$name->Username,我得到了以下错误:试图获取非objec的属性

我使用PDO::FETCH_OBJ返回一个对象而不是一个数组,但仍然不起作用。

您的选择返回所有用户的数组。您使用查询将结果简化为一个结果,但PDO并不知道这一点。

请改用$query->fetch(PDO::FETCH_OBJ)


您的视图是在Controller::view()方法中加载的(必需)。它只能访问变量,此方法本身可以访问。因此无法到达$name

你可以这样更改你的查看方法:

public function view($view, array $parameters = [])
{
     foreach ($parameters as $varname => $value) {
           $$varname = $value;
     }
     require '../app/views/'. $view .'.php';
}

现在你可以这样使用它:

public function index()
{
    $this->view('contact/index', ['name'=>'David']);
}

Controller中为视图中要访问的变量创建一个set函数,例如(取自CakePHP):

    public function set($one, $two = null) {
        if (is_array($one)) {
            if (is_array($two)) {
                $data = array_combine($one, $two);
            } else {
                $data = $one;
            }
        } 
        else {
            $data = array($one => $two);
        }
        $this->viewVars = $data + $this->viewVars;
    }

现在,如果希望$variable在视图中可访问(值为value),则可以使用$this->set('variable', 'value')

然后,在渲染视图之前,使用extract($this->viewVars);,就可以在视图中使用$variable