当前位置: 首页 > 知识库问答 >
问题:

从CodeIgniter中的核心控制器获取数据

尉迟冯浩
2023-03-14

我正在开发一个社交网络应用程序。我遇到了一个问题,我试图从数据库中名为用户的表中获取名称和用户名。为了能够做到这一点,而无需单独访问所有控制器,我必须创建一个名为MY_Controller的核心控制器。

问题是(MY_Controller没有公共$用户):

<?php

class MY_Controller extends CI_Controller
{

//public $users = array('username' => $this->input->post('username')); 


    function __construct()
    {
        parent::__construct();

        //Get user data to make it available for both Admin and Public Controllers
        $this->load->model('User_model');
        $this->users = $this->User_model->get_list();

        //Load Menu Library
        $this->load->library('menu');
        $this->pages = $this->menu->get_pages();

        // Brand/Logo
        $this->favicon = 'https://blogpersonal.net/wp-content/uploads/2017/08/favicon-v2-150x150.png';
        $this->brand = 'Some Name';
        $this->description = 'Some Description';
        $this->credits = 'https://blogpersonal.net/';
        $this->version = '1.1.1';
    }
}

class Admin_Controller extends MY_Controller
{

    function __construct()
    {
        parent::__construct();

        if (!$this->session->is_admin) {
            redirect('admin/login');
        }

        //some code here

    }
}

class Public_Controller extends MY_Controller{
    function __construct(){
        parent::__construct();

        //some code here

    }

}

class Social_Controller extends MY_Controller
{

    function __construct()
    {
        parent::__construct();

        if (!$this->session->is_member) {
            redirect('dashboard/login');
        }

        //some code here

    }
}

如您所见,我使用__construct函数加载了User_model,使其可用并在所有控制器中使用。

我想在名为templates的文件夹中获取数据。意见

    <?php if($this->users) : ?>
        <li class="dropdown user user-menu">
          <!-- Menu Toggle Button -->
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            <!-- The user image in the navbar-->
            <img src="<?php echo base_url(); ?>assets/img/user2-160x160.jpg" class="user-image" alt="User Image">
            <!-- hidden-xs hides the username on small devices so only the image appears. -->
            <span class="hidden-xs"><?php echo $this->users['username']; ?></span>
          </a>

        </li>
    <?php endif; ?>

这是老错误。它向我显示了一个错误。我做错什么了吗?谁能告诉我怎么修吗。这是我第一次无法获取数据。这是我得到的结果:

遇到一个PHP错误

严重性:通知

消息:未定义变量:用户

文件名:Templates/public。php

行号:161

回溯:

文件:C:\xampp\htdocs\codeigniter\application\views\Templates\public。php行:161函数:_错误\u处理程序

File: C:\xampp\htdocs\codeigniter\应用程序\库\Template.php行:34功能:视图

文件:C:\xampp\htdocs\codeigniter\application\controllers\Pages。php行:12函数:加载

File: C:\xampp\htdocs\codeigniter\index.php行:315功能:require_once

这是我的模型(用户模型),以备您可能需要:

<?php

class User_model extends CI_MODEL
{

    function __construct()
    {
        parent::__construct();
        $this->table = 'users';
    }

    public function get_list()
    {
        $query = $this->db->get($this->table);
        return $query->result();
    }

    public function get($id)
    {
        $this->db->where('id', $id);
        $query = $this->db->get($this->table);
        return $query->row();
    }

    public function add($data)
    {
        $this->db->insert($this->table, $data);
    }

    public function update($id, $data)
    {
        $this->db->where('id', $id);
        $this->db->update($this->table, $data);
    }

    public function delete($id)
    {
        $this->db->where('id', $id);
        $this->db->delete($this->table);
    }

    public function login($username, $password)
    {
        $this->db->select('*');
        $this->db->from($this->table);
        $this->db->where('username', $username);
        $this->db->where('password', $password);
        $this->db->limit(1);

        $query = $this->db->get();

        if ($query->num_rows() == 1) {
            return $query->row()->id;
        } else {
            return false;
        }
    }
}

现在,根据向我建议的更改,它现在显示了一个新错误:

新的错误:

遇到一个PHP错误

严重性:通知消息:未定义索引:用户名文件名:模板/public.php行号:168

回溯:

文件:C:\xampp\htdocs\codeigniter\application\views\Templates\public。php行:168函数:\u错误\u处理程序

File: C:\xampp\htdocs\codeigniter\应用程序\库\Template.php行:34功能:视图

文件:C:\xampp\htdocs\codeigniter\application\controllers\public\Dashboard。php行:13函数:加载

File: C:\xampp\htdocs\codeigniter\index.php行:315功能:require_once

现在,如果在Core控制器(MY_Controller)中取消注释公共$用户,它也会显示一个新的错误:

public$users超出_构造函数时出现新错误

致命错误:常量表达式在第6行的C:\xampp\htdocs\codeigniter\Application\core\MY_Controller.php中包含无效操作遇到PHP错误

严重性:编译错误

消息:常量表达式包含无效操作

文件名:core/MY_控制器。php

行号: 6

回溯:

下面是一张图片,我正试图从中获取数据:

我做错什么了吗?谢谢帮忙。

以下是视图(public.php)文件:

<ul class="nav navbar-nav">
          <?php if(!$this->session->is_member) : ?>
          <li><?php echo anchor('public/users/login', 'Login'); ?></li>
          <li><?php echo anchor('public/users/register', 'Register'); ?></li>
          <?php else : ?>
            <!-- Messages: style can be found in dropdown.less-->
            <li class="dropdown messages-menu">
              <!-- Menu toggle button -->
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                <i class="fa fa-envelope-o"></i>
                <span class="label label-success">4</span>
              </a>
              <ul class="dropdown-menu">
                <li class="header">You have 4 messages</li>
                <li>
                  <!-- inner menu: contains the messages -->
                  <ul class="menu">
                    <li><!-- start message -->
                      <a href="#">
                        <div class="pull-left">
                          <!-- User Image -->
                          <img src="<?php echo base_url(); ?>assets/img/user2-160x160.jpg" class="img-circle" alt="User Image">
                        </div>
                        <!-- Message title and timestamp -->
                        <h4>
                          Support Team
                          <small><i class="fa fa-clock-o"></i> 5 mins</small>
                        </h4>
                        <!-- The message -->
                        <p>Why not buy a new awesome theme?</p>
                      </a>
                    </li>
                    <!-- end message -->
                  </ul>
                  <!-- /.menu -->
                </li>
                <li class="footer"><a href="#">See All Messages</a></li>
              </ul>
            </li>
            <!-- /.messages-menu -->
            <!-- Notifications Menu -->
            <li class="dropdown notifications-menu">
              <!-- Menu toggle button -->
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                <i class="fa fa-bell-o"></i>
                <span class="label label-warning">10</span>
              </a>
              <ul class="dropdown-menu">
                <li class="header">You have 10 notifications</li>
                <li>
                  <!-- Inner Menu: contains the notifications -->
                  <ul class="menu">
                    <li><!-- start notification -->
                      <a href="#">
                        <i class="fa fa-users text-aqua"></i> 5 new members joined today
                      </a>
                    </li>
                    <!-- end notification -->
                  </ul>
                </li>
                <li class="footer"><a href="#">View all</a></li>
              </ul>
            </li>
            <!-- Tasks Menu -->
            <li class="dropdown tasks-menu">
              <!-- Menu Toggle Button -->
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                <i class="fa fa-flag-o"></i>
                <span class="label label-danger">9</span>
              </a>
              <ul class="dropdown-menu">
                <li class="header">You have 9 tasks</li>
                <li>
                  <!-- Inner menu: contains the tasks -->
                  <ul class="menu">
                    <li><!-- Task item -->
                      <a href="#">
                        <!-- Task title and progress text -->
                        <h3>
                          Design some buttons
                          <small class="pull-right">20%</small>
                        </h3>
                        <!-- The progress bar -->
                        <div class="progress xs">
                          <!-- Change the css width attribute to simulate progress -->
                          <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
                            <span class="sr-only">20% Complete</span>
                          </div>
                        </div>
                      </a>
                    </li>
                    <!-- end task item -->
                  </ul>
                </li>
                <li class="footer">
                  <a href="#">View all tasks</a>
                </li>
              </ul>
            </li>
            <!-- User Account Menu -->
            <?php if($this->users) : ?>
                <li class="dropdown user user-menu">
                  <!-- Menu Toggle Button -->
                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                    <!-- The user image in the navbar-->
                    <img src="<?php echo base_url(); ?>assets/img/user2-160x160.jpg" class="user-image" alt="User Image">
                    <!-- hidden-xs hides the username on small devices so only the image appears. -->
                    <span class="hidden-xs"><?php echo $this->users['username']; ?></span>
                  </a>
                  <ul class="dropdown-menu">
                    <!-- The user image in the menu -->
                    <li class="user-header">
                    <img src="<?php echo base_url(); ?>assets/img/user2-160x160.jpg" class="img-circle" alt="User Image">
                      <p><?php echo $this->users['name']; ?> - Web Developer<small>Member since Nov. 2012</small></p>
                    </li>
                    <!-- Menu Body -->
                    <li class="user-body">
                      <div class="row">
                        <div class="col-xs-4 text-center">
                          <a href="#">Followers</a>
                        </div>
                        <div class="col-xs-4 text-center">
                          <a href="#">Sales</a>
                        </div>
                        <div class="col-xs-4 text-center">
                          <a href="#">Friends</a>
                        </div>
                      </div>
                      <!-- /.row -->
                    </li>
                    <!-- Menu Footer-->
                    <li class="user-footer">
                      <div class="pull-left">
                        <a href="#" class="btn btn-default btn-flat">Profile</a>
                      </div>
                      <div class="pull-right">
                        <a href="<?php echo base_url(); ?>public/users/logout" class="btn btn-default btn-flat">Sign out</a>
                      </div>
                    </li>
                  </ul>
                </li>
            <?php endif; ?>
            <li>
                <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
            </li>
          <?php endif; ?>
          </ul>

共有2个答案

宦书
2023-03-14

你目前有这个。

class MY_Controller extends CI_Controller
{

function __construct()
{
    parent::__construct();

    //Get user data to make it available for both Admin and Public Controllers
    $this->load->model('User_model');
    $data['users'] = $this->User_model->get_list();

你应该用这个-

class MY_Controller extends CI_Controller
{

function __construct()
{
    parent::__construct();

    //Get user data to make it available for both Admin and Public Controllers
    $this->load->model('User_model');
    $this->data['users'] = $this->User_model->get_list();

加载视图时,请使用下面的代码

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

它将显示所有变量(在视图中)存储在父类构造函数

亢奇
2023-03-14

你现在有这个。。。我只是在这里展示一些片段。。。

class MY_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();

        //Get user data to make it available for both Admin and Public Controllers
        $this->load->model('User_model');
        $data['users'] = $this->User_model->get_list();

<<<<snip>>>>

有人建议您将本地定义的$data['users']转换为“属性”

所以我们现在有两个变化。。。

1.申报财产

2设置属性。

class MY_Controller extends CI_Controller
{
    public $users = array(); // Add the property $user, safe def of an empty array

    function __construct()
    {
        parent::__construct();

        //Get user data to make it available for both Admin and Public Controllers
        $this->load->model('User_model');
        //$data['users'] = $this->User_model->get_list();
        // Give the property something to share. 
        $this->users = $this->User_model->get_list();


    <<<<snip>>>>

现在所有扩展MY_Controller的控制器都可以访问$this

所以你参考$this-

我建议您首先阅读类、属性、方法和继承。通常这足以让你变得危险。这需要一点适应,但值得努力...

更新:在调用视图的控制器中,您将执行$data['users']=$this-

在你看来,你现在把它称为$users-

 类似资料:
  • 问题内容: 我有一个控制器,该控制器的操作可以显示一组特色产品。但是,产品是通过包含专有模型和视图的控制器进行管理的。 如何从控制器中的操作中访问信息?实例化无法运行,因为该类未在运行时加载,并且CodeIgniter也未提供动态加载控制器的方法。将类放入库文件中实际上也不起作用。 确切地说,我需要在索引视图中插入产品视图(填充有控制器处理的数据)。我正在运行CodeIgniter 2.0.2。

  • 问题内容: 我有2种情况,我要在codeigniter中提取同一表的全部数据和行总数,我想知道那是一种方法,可以从中获取行总数,整个数据和3个最新插入的记录通过一个代码在同一张桌子上 两种情况的控制器代码如下(尽管我分别使用不同的参数将其应用于每种情况) 1)从codeigniter中的表中获取全部数据 型号代码 查看代码 2)在Codeigniter中从表中获取行数 查看代码 问题答案: 您只能

  • 问题内容: 我想从另一个控制器的函数中加载一个控制器,因为我集成到项目中的库我不想将其加载到控制器中,因为我想保持它的清洁和相关性。 我有默认的控制器,所以我可以加载,这样我怎么能从main函数访问控制器,所以我不必将控制器放在url中。 如果我可以从主控制器功能中加载控制器功能,我仍然愿意使用HMVC。 问题答案: 您无法从CI中的控制器加载控制器-除非您使用HMVC或其他工具。 您应该考虑一下

  • 我将验证当前活动用户是否有权限访问公司。下面我有两个示例的GET和PUT请求,以获取公司的详细信息和更新公司的详细信息。有没有可能写一个数据注释,这样我就可以指向它,或者发送一个属性,这样我就可以验证用户是否可以访问它了? 示例:

  • 问题内容: 有没有办法从AngularJS中的当前$ scope中获取控制器名称? 问题答案: 不,不可能。如果属于指令怎么办?没有属性可以检索有关该范围所属的控制器的信息。