Php 试图从模型中获取数据以进行查看,我遇到了以下错误:试图获取非对象和未定义变量的属性

Php 试图从模型中获取数据以进行查看,我遇到了以下错误:试图获取非对象和未定义变量的属性,php,model-view-controller,pdo,view,Php,Model View Controller,Pdo,View,我正在尝试创建一个基本的MVC“框架”,但在从模型到视图获取数据时遇到了一些问题 class Controller { public $_database = null; public $_model = null; public function __construct() { $this->connect(); } private function connect() { $options =

我正在尝试创建一个基本的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

如果我只是在contact controller中调用require'../app/views/contact/index.php',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')->在联系人控制器中选择,并在“联系人/索引”视图中选择echo$name->Username,我得到以下错误:试图获取非对象的属性


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

您的选择返回一个包含所有用户的数组。通过查询将结果减少为1,但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']);
}
现在您可以这样使用它:

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']);
}

您的选择正在返回一个包含所有用户的数组。通过查询将结果减少为1,但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']);
}
现在您可以这样使用它:

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']);
}

控制器中为您希望在视图中访问的变量创建
set
函数,例如(取自CakePHP):

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


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

控制器中为您希望在视图中访问的变量创建
set
函数,例如(取自CakePHP):

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


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

哦,我太笨了。谢谢你!你对“观点”问题有什么看法吗?@Mihaimie:我在回答这个问题时加了一个建议。哦,我太笨了。谢谢你!你对“视图”问题有什么想法?@MihaiMiY:我在回答中添加了一个关于该问题的建议。我使用了提取功能,效果很好!无论如何,谢谢你:)我使用了提取功能,效果很好!无论如何,谢谢你:)