我最近一直在尝试使用CodeIgniter 3,但在显示数据库中的数据时遇到了一些麻烦。通常我会执行以下功能:
function listOfPlayers($game, $uid) {
$q = "SELECT * FROM users WHERE game='$game' ORDER BY id ASC";
$result = $this->connection->query($q);
$count = $result->num_rows;
$i = 1;
while($obj = $result->fetch_object()) {
$id = $obj->id;
$name = htmlspecialchars($obj->name);
if ($uid == $id) {
} else {
echo
"<tr>
<td><a href = \"#\">".$name."</a></td>
</tr>";
if($i != $count) {
}
$i++;
}
}
}
并直接在我的“视图”中调用它。但是现在由于MVC系统,我对如何使用CI感到困惑,因为这是我第一次使用MVC系统,所以不要对我苛刻:P
先感谢您!
您的代码看起来还不错,但是您应该遵循MVC来操作数据。您应该如何真正拥有它是这样的,这是一个CI 3示例:
设置模型
应该将查询放置在模型中,而不是直接在控制器中编写数据库操作,以便以后可以轻松重用它们。模型是在数据库或其他数据存储中检索,插入和更新信息的地方。它们代表您的数据。
打开application/models
目录并创建一个名为News_model.php的新文件,并添加以下代码。确保已按照此处所述正确配置数据库。
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
}
该代码看起来与之前使用的控制器代码相似。它通过扩展CI_Model来创建新模型并加载数据库库。这将通过$ this-> db对象使数据库类可用。
在查询数据库之前,必须创建数据库架构。连接到数据库并运行下面的SQL命令。还添加一些种子记录。
CREATE TABLE news (
id int(11) NOT NULL AUTO_INCREMENT,
title varchar(128) NOT NULL,
slug varchar(128) NOT NULL,
text text NOT NULL,
PRIMARY KEY (id),
KEY slug (slug)
);
现在已经建立了数据库和模型,您将需要一种方法来从数据库中获取我们所有的帖子。为此,使用了CodeIgniter随附的数据库抽象层(活动记录)。这样就可以一次编写“查询”,并使它们在所有受支持的数据库系统上工作。将以下代码添加到模型中。
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
使用此代码,您可以执行两个不同的查询。您可以获取所有新闻记录,也可以按其条目获取新闻。您可能已经注意到$ slug变量在运行查询之前没有被清除。查询构建器会为您执行此操作。显示新闻
现在已经编写了查询,应该将模型绑定到将向用户显示新闻项目的视图。这可以在我们之前创建的页面控制器中完成,但是为了清楚起见,定义了一个新的“新闻”控制器。在application / controllers / News.php中创建新的控制器。
<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('news_model');
}
public function index()
{
$data['news'] = $this->news_model->get_news();
}
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
}
}
查看代码,您可能会发现与我们之前创建的文件有些相似。首先,__construct()方法:它调用其父类(CI_Controller)的构造函数并加载模型,因此可以在此控制器中的所有其他方法中使用它。
接下来,有两种方法可以查看所有新闻,一种是查看特定新闻。您可以看到$ slug变量在第二种方法中传递给了模型的方法。该模型正在使用此块来标识要返回的新闻项。
现在,控制器通过我们的模型检索了数据,但是什么都没有显示。接下来要做的就是将这些数据传递给视图。
public function index()
{
$data['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';
$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
}
上面的代码从模型中获取所有新闻记录,并将其分配给变量。标题的值也分配给$ data ['title']元素,所有数据都传递给视图。现在,您需要创建一个视图以呈现新闻项。创建application / views / news / index.php并添加下一段代码。
<h2><?php echo $title ?></h2>
<?php foreach ($news as $news_item): ?>
<h3><?php echo $news_item['title'] ?></h3>
<div class="main">
<?php echo $news_item['text'] ?>
</div>
<p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p>
<?php endforeach ?>
在这里,每个新闻项目都循环播放并显示给用户。您可以看到我们用PHP和HTML混合编写了模板。如果您喜欢使用模板语言,则可以使用CodeIgniter的Template Parser类或第三方解析器。
现在已完成新闻概述页面,但是仍然缺少用于显示各个新闻项目的页面。先前创建的模型的制作方式很容易将其用于此功能。您只需要向控制器添加一些代码并创建一个新视图。返回新闻控制器,并使用以下命令更新view():
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
if (empty($data['news_item']))
{
show_404();
}
$data['title'] = $data['news_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
传递$ slug变量而不是调用不带参数的get_news()方法,这样它将返回特定的新闻项。剩下要做的就是在application / views / news / view.php中创建相应的视图。将以下代码放入此文件。
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
路由
由于之前创建了通配符路由规则,因此您需要一条额外的路由来查看您刚创建的控制器。修改您的路由文件(application / config / routes.php),如下所示。这样可以确保请求到达新闻控制器,而不是直接到达页面控制器。第一行将带有条的URI路由到新闻控制器中的view方法。
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';
将浏览器指向文档根目录,然后指向index.php / news并观看新闻页面。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句