Codeigniter 从数据库中创建一个列表
Codeigniter making a list from database
我最近一直在尝试迁移到 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++;
}
}
}
并直接在我的 "view" 中调用它。但是现在我很困惑我应该如何使用 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 并加载数据库库来创建一个新模型。这将使数据库 class 通过 $this->db object.
可用
在查询数据库之前,必须创建一个数据库模式。连接到您的数据库和 运行 下面的 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 中包含的数据库抽象层——Active Record。这使得编写一次“查询”并使它们在所有支持的数据库系统上工作成为可能。将以下代码添加到您的模型中。
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 获取新闻项。您可能已经注意到 $slug 变量在 运行 查询之前没有被清理; Query Builder 会为您完成这项工作。
显示新闻
现在已经编写了查询,应该将模型绑定到将要向用户显示新闻项的视图。这可以在我们之前创建的页面控制器中完成,但为了清楚起见,定义了一个新的“新闻”控制器。在 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() 方法:它调用其 parent class (CI_Controller) 的构造函数并加载模型,因此它可以在所有其他方法中使用这个控制器。
接下来,有两种方法可以查看所有新闻条目,一种方法可以查看特定新闻条目。您可以看到 $slug 变量在第二个方法中传递给了模型的方法。该模型使用此 slug 来识别要 returned 的新闻项目。
现在控制器通过我们的模型检索数据,但还没有显示任何内容。接下来要做的是将此数据传递给视图。
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 的模板解析器 class 或第三方解析器。
新闻概览页面已经完成,但仍然没有显示个别新闻条目的页面。先前创建的模型的制作方式使其可以轻松用于此功能。您只需要向控制器添加一些代码并创建一个新视图。返回新闻控制器并使用以下内容更新 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');
}
不是调用不带参数的 get_news() 方法,而是传递 $slug 变量,因此它将 return 特定的新闻项目。剩下要做的唯一事情就是在 application/views/news/view.php 处创建相应的视图。将以下代码放入此文件中。
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
路由
由于之前创建的通配符路由规则,你需要一个额外的路由来查看你刚刚制作的控制器。修改您的路由文件 (application/config/routes.php),使其看起来如下所示。这确保请求到达新闻控制器而不是直接进入页面控制器。第一行将带有 slug 的 URI 路由到新闻控制器中的视图方法。
$route['news/(:any)'] = 'news/view/';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/';
$route['default_controller'] = 'pages/view';
将浏览器指向您的文档根目录,然后是索引。php/news 并观看您的新闻页面。
我最近一直在尝试迁移到 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++;
}
}
}
并直接在我的 "view" 中调用它。但是现在我很困惑我应该如何使用 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 并加载数据库库来创建一个新模型。这将使数据库 class 通过 $this->db object.
可用在查询数据库之前,必须创建一个数据库模式。连接到您的数据库和 运行 下面的 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 中包含的数据库抽象层——Active Record。这使得编写一次“查询”并使它们在所有支持的数据库系统上工作成为可能。将以下代码添加到您的模型中。
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 获取新闻项。您可能已经注意到 $slug 变量在 运行 查询之前没有被清理; Query Builder 会为您完成这项工作。 显示新闻
现在已经编写了查询,应该将模型绑定到将要向用户显示新闻项的视图。这可以在我们之前创建的页面控制器中完成,但为了清楚起见,定义了一个新的“新闻”控制器。在 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() 方法:它调用其 parent class (CI_Controller) 的构造函数并加载模型,因此它可以在所有其他方法中使用这个控制器。
接下来,有两种方法可以查看所有新闻条目,一种方法可以查看特定新闻条目。您可以看到 $slug 变量在第二个方法中传递给了模型的方法。该模型使用此 slug 来识别要 returned 的新闻项目。
现在控制器通过我们的模型检索数据,但还没有显示任何内容。接下来要做的是将此数据传递给视图。
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 的模板解析器 class 或第三方解析器。
新闻概览页面已经完成,但仍然没有显示个别新闻条目的页面。先前创建的模型的制作方式使其可以轻松用于此功能。您只需要向控制器添加一些代码并创建一个新视图。返回新闻控制器并使用以下内容更新 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');
}
不是调用不带参数的 get_news() 方法,而是传递 $slug 变量,因此它将 return 特定的新闻项目。剩下要做的唯一事情就是在 application/views/news/view.php 处创建相应的视图。将以下代码放入此文件中。
<?php
echo '<h2>'.$news_item['title'].'</h2>';
echo $news_item['text'];
路由
由于之前创建的通配符路由规则,你需要一个额外的路由来查看你刚刚制作的控制器。修改您的路由文件 (application/config/routes.php),使其看起来如下所示。这确保请求到达新闻控制器而不是直接进入页面控制器。第一行将带有 slug 的 URI 路由到新闻控制器中的视图方法。
$route['news/(:any)'] = 'news/view/';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/';
$route['default_controller'] = 'pages/view';
将浏览器指向您的文档根目录,然后是索引。php/news 并观看您的新闻页面。