CodeIgniter get_where

时间:2009-10-16 10:42:52

标签: php codeigniter

我正在尝试使用get_where来获取所有者等于登录用户的所有数据库记录的列表。

这是我在我的控制器中的功能;

function files()
{
    $owner = $this->auth->get_user();

    $this->db->get_where('files', array('owner =' => '$owner'))->result();
}

在我看来,我有以下内容;

<?php foreach($query->result() as $row): ?>

    <span><?=$row->name?></span>

<?php endforeach; ?>

当我尝试访问视图时,我收到致命错误:在第1行的/views/account/files.php中的非对象上调用成员函数result()。

想知道是否有人对此可能有什么想法?

谢谢

4 个答案:

答案 0 :(得分:20)

CodeIgniter是一个基于MVC原则的框架。因此,您通常会将应用程序逻辑,数据抽象和“输出”分离到各自的区域以供CodeIgniter使用。在这种情况下:控制器,模型和视图。

仅供参考,您通常应将“数据”代码作为模型函数,在本例中为get_where功能。我强烈建议您仔细阅读提供的User Guide以了解CodeIgniter,它应该掌握大部分步骤。请参阅:目录(右上角)。

<强> TL; DR

要解决您的问题,您需要确保将控制器变量传递到您的视图:

function files()
{
    $owner = $this->auth->get_user();

    $data['files'] = $this->db->get_where('files', array('owner =' => '$owner'))->result();

    $this->load->view('name_of_my_view', $data);
}

然后确保在视图中使用正确的变量:

<?php foreach($files as $row): ?>

    <span><?=$row['name']; ?></span>

<?php endforeach; ?>

答案 1 :(得分:4)

<?php foreach($query->result() as $row): ?>

    <span><?=$row->name?></span>

<?php endforeach; ?>

删除结果函数。

<?php foreach($query as $row): ?>

    <span><?=$row->name?></span>

<?php endforeach; ?>

顺便说一下。在返回结果之前测试结果的查询是一个更好的主意。

function files()
{
    $owner = $this->auth->get_user();

    $query = $this->db->get_where('files', array('owner =' => '$owner'))->result();

    if ($query->num_rows() > 0)
    {
        return $query->result();
    }
    return FALSE;
}

答案 2 :(得分:0)

public function get_records(){
   return $this->db->get_where('table_name', array('column_name' => value))->result();
}

这是使用get_where()方法从数据库返回数据的方法。

答案 3 :(得分:0)

  1. 所有查询应在模型中执行。
  2. 视图中的处理逻辑应保持在绝对最低限度。如果需要使用一些基本的循环或条件,可以,但是几乎所有数据准备工作都应在View之前完成。
  3. 通过单引号$owner,将其转换为文字字符串-换句话说,将其表示为美元符号,后跟五个字母,这肯定不是您想要的。
  4. codeigniter的where方法的默认比较是=,因此您无需声明等号。
  5. 我不知道您使用的是哪个Auth库,因此我会冒充get_user()返回一个对象-您希望访问该对象的当前用户ID。这将需要将->id链接到方法调用的末尾以访问id属性。

现在,让我们重新编写您的MVC架构。

故事从控制器开始。您没有传入任何数据,因此它的职责是:

  1. 加载模型(如果尚未加载)
  2. 调用模型方法并将所有者ID作为参数传递。
  3. 加载视图并将模型的返回结果集作为参数传递。

*请注意,这里没有查询,也没有内容显示。

控制器:(没有一次性变量)

public function files() {
    $this->load->model('Files_model');
    $this->load->view(
        'user_files',
        ['files' => $this->Files_model->Files($this->auth->get_user()->id)]
    );
}

或者,如果您喜欢声明性的好处/可读性,则可以使用一次性变量编写控制器

public function files() {
    $this->load->model('Files_model');
    $userId = $this->auth->get_user()->id;
    $data['files'] = $this->Files_model->Files($userId);
    $this->load->view('user_files', $data);
}

模型:(传递参数,返回结果集)

public function Files($userId) {
    return $this->db->get_where('files', ['owner' => $userId])->result();
}

在上面的代码段中,生成的查询将是:

SELECT * FROM files WHERE owner = $userId

如果没有合格结果或对象的索引数组,则结果集(假设查询适合db表模式)将为空数组。无论哪种方式,返回值都将是一个数组。

在最后一步中,视图将收到填充为$files的结果集(变量由在视图加载方法中声明的关联的第一级键命名)。

查看:

<?php
foreach ($files as $file) {
    echo "<span>{$file->name}</span>";
}

{}并不是必不可少的,我只是更喜欢在IDE中阅读。

总而言之,数据流如下:

控制器->模型->控制器->视图

仅该模型进行数据库交互。 只有视图打印到屏幕上。