【发布时间】:2016-05-29 00:02:09
【问题描述】:
我正在使用fat free PHP framework 开发一个项目。在文档中,他们说你可以为项目构建自己的骨架,所以我的项目目录如下:
- 资产
- CSS
- js
- 控制器
- Controller.php
- Home_Controller.php
- lib(有框架的东西)
- 型号
- 模型.php
- Model_Home.php
- 查看次数
- 首页
- main.html
- 首页
- index.php
在 index.php 中,我调用了框架(包括数据库连接的控制器和模型),并且我的路由如下:
// Kickstart the framework
$f3=require($_SERVER['DOCUMENT_ROOT'] . '/project_name/lib/base.php');
$f3->set('AUTOLOAD',''.$_SERVER['DOCUMENT_ROOT'] . '/project_name/controllers/; '.$_SERVER['DOCUMENT_ROOT'] . '/project_name/models/');
$f3->set('DEBUG',3);
if ((float)PCRE_VERSION<7.9){
trigger_error('PCRE version is out of date');
}
if (!($f3->get('DEBUG')))
{
$f3->set('ONERROR',
function($f3) {
$f3->reroute('/');
}
);
}
/****************** Start Routing the URLs ******************/
/****** Home Controller ******/
$f3->route('GET|HEAD /',
function($f3) {
$f3->reroute('/home');
}
);
$f3->route('GET|HEAD /index',
function($f3) {
$f3->reroute('/home');
}
);
$f3->route('GET /home','Controller_Home->main');
$f3->run();
在 Model.php 中,我有一个函数可以成功连接到我拥有的数据库,如下所示:
class Model
{
public $f3, $db;
public function connect()
{
global $db;
$username = 'username';
$password = 'password';
$hostname = 'hostname';
$dbname = 'dbname';
try{
$db = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo $e->getMessage();
}
print_r($db); // this will give PDO Object ( )
$this->db = $db;
}
}
// if you try to execute query here, it will work.
现在,在 Controller.php 中,我正在调用 Model.php 中的 connect() 函数,如下所示:
class Controller extends Model
{
public $f3, $db;
public function __construct($f3)
{
$this->f3 = $f3;
$this->connect();
}
}
Model_Home.php 具有查询数据库的函数,如下所示:
class Model_Home extends Model
{
public $f3, $db;
public static function getUsers()
{
$query = "SELECT * FROM users";
$result = $this->db->query($query);
$output = '';
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$output.= '<tr>
<td>'.$row['attrib1'].'</td>
<td>'.$row['attrib2'].'</td>
<td>'.$row['attrib3'].'</td>
<td>'.$row['attrib4'].'</td>
<td>'.$row['attrib5'].'</td>
</tr>';
}
return $output;
}
}
Controller_Home.php 会静态调用前面的函数,然后调用右视图渲染结果如下:
class Controller_Home extends Controller
{
public $f3, $db;
public function main($output = '')
{
//setting up the variables
$this->f3->set('getUsersTable', Model_Home::getUsers());
// getUsersTable is a variable that will be passed to the view to reder
//calling the view
$this->f3->set('main','views/home/main.html');
}
}
最后是 main.html 页面,如下所示:
<h1>All Users</h1></br>
<?php echo htmlspecialchars_decode($getUsersTable); ?>
当我运行代码时,它会给我一条错误消息: 致命错误:不在对象上下文中使用 $this
project_name/models/Model_Home.php:8
指的是Model_Home.php中的以下行
$result = $this->db->query($query);
我必须使用的 php 版本是 5.4(相当旧)。有什么想法,请!
谢谢大家!
【问题讨论】:
-
“无脂肪”框架的好处在于它允许您按照自己的方式做事,而无需强加严格的规则。我建议从模型中取出数据库访问凭据,并使用 config(.ini) 文件来存储这些凭据。此外,不要让模型在每次调用其构造函数时都调用一个连接函数,而应该只连接一次并重用相同的连接。如果您对更多细节感兴趣,可以查看这个项目github.com/Alanaktion/phproject,我相信它的设置非常好
-
你说得对,我曾尝试在代码的构造函数中建立一次连接,但没有成功。现在,每次我想执行查询时,我都会调用连接函数。你能帮我用我的骨架解决这个问题吗?谢谢丹尼尔!
标签: php model-view-controller pdo fat-free-framework