Php 试图从模型中获取数据以进行查看,我遇到了以下错误:试图获取非对象和未定义变量的属性
我正在尝试创建一个基本的MVC“框架”,但在从模型到视图获取数据时遇到了一些问题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 =
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:我在回答中添加了一个关于该问题的建议。我使用了提取功能,效果很好!无论如何,谢谢你:)我使用了提取功能,效果很好!无论如何,谢谢你:)