试图从模型获取数据到视图,我得到这些错误: 试图获取非对象和未定义变量的属性

Posted

技术标签:

【中文标题】试图从模型获取数据到视图,我得到这些错误: 试图获取非对象和未定义变量的属性【英文标题】:Trying to get data from Model to View and i get these errors: Trying to get property of non-object and Undefined variable 【发布时间】:2016-05-04 13:53:01 【问题描述】:

我正在尝试创建一个基本的 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' 视图中回显 $name 我收到此错误:未定义变量:名称

如果我只是在 Contact 控制器中调用 require '../app/views/contact/index.php',则 index 方法可以正常工作,但是通过调用从控制器查看方法我得到这个错误。

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

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);
    

通过在 Contact Controller 中调用 $name = $this->model('User')->selectecho $name-> “联系人/索引”视图中的用户名我收到此错误:尝试获取非对象的属性

我使用 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']);

【讨论】:

哦,我太笨了。谢谢!您对“视图”问题有想法吗? @MihaiMiY:我在回答中添加了针对该问题的建议。【参考方案2】:

在您的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

【讨论】:

我使用了提取功能并且工作正常!还是谢谢你:)

以上是关于试图从模型获取数据到视图,我得到这些错误: 试图获取非对象和未定义变量的属性的主要内容,如果未能解决你的问题,请参考以下文章

试图获得非对象的属性? PHP /笨

Xamarin 从视图模型传递列表数据以进行视图绑定

MySQL之试图触发器事务存储过程函数

模型数组的 Codeigniter 错误

试图获取非对象的属性“名称”(视图:(...)资源/视图/产品/index.blade.php)

试图获取非对象的属性