【问题标题】:CodeIgniter get_whereCodeIgniter get_where
【发布时间】:2023-03-05 20:31:01
【问题描述】:

我正在尝试使用 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()。

想知道是否有人对此有任何想法?

谢谢

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:
    public function get_records(){
       return $this->db->get_where('table_name', array('column_name' => value))->result();
    }
    

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

    【讨论】:

      【解决方案2】:

      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; ?>
      

      【讨论】:

      • 到底是什么?你为什么单引号$owner?没人抓到这个吗?
      【解决方案3】:
      <?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;
      }
      

      【讨论】:

        【解决方案4】:
        1. 所有查询都应在模型中执行。
        2. 视图中的处理逻辑应保持在最低限度。如果您需要使用一些基本的循环或条件,可以,但几乎所有的数据准备都应该在 View 之前完成。
        3. 通过单引号 $owner 变量,您可以将其转换为文字字符串 - 换句话说,它呈现为一个美元符号后跟五个字母,这肯定不是您想要的。
        4. codeigniter 的where 方法的默认比较是=,所以你不需要声明等号。
        5. 我不知道您使用的是哪个 Auth 库,所以我会冒险假设get_user() 返回一个对象——您希望访问该对象的当前用户的 ID。这将需要将 -&gt;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();
        }
        

        在上面的 sn-p 中,生成的查询将是:

        SELECT * FROM files WHERE owner = $userId
        

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

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

        查看:

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

        {} 不是必需的,我只是更喜欢它在我的 IDE 中的可读性。

        总而言之,数据流是这样的:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-12
          • 2016-10-22
          • 2017-11-24
          • 1970-01-01
          • 2019-09-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多