试图从模型获取数据到视图,我得到这些错误: 试图获取非对象和未定义变量的属性
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')->select 和 echo $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
。
【讨论】:
我使用了提取功能并且工作正常!还是谢谢你:)以上是关于试图从模型获取数据到视图,我得到这些错误: 试图获取非对象和未定义变量的属性的主要内容,如果未能解决你的问题,请参考以下文章