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 并观看您的新闻页面。