Codeigniter 3 - 从模型到控制器加载动态数据的问题

时间:2016-03-07 00:43:16

标签: php codeigniter codeigniter-3

好。所以我一直在我自己错误的地方。我不是那么新的PHP,但我也不是专家,虽然我越来越习惯于OOP。我最近进入了CodeIgniter 3.我喜欢它,我使用它,它在开始时很容易掌握。

但是,我处于学习阶段,我无法使用Model从数据库成功传递动态数据。

就像一个FYI:我使用MY_Controller作为我的基本控制器,并设置了一个$ data对象来传递应用程序范围内的变量。我知道我的问题不是由于MY_Controller的使用,因为当我使用静态$this->data['KEY'] = 'VALUE';$this->data array('KEY' => 'VALUE');时,我的变量会传递到我的视图中。所以MY_Controller是有效的。

我的问题在于创建Settings_model。其唯一目的是从数据库表settings中获取数据,并推断某些数据列,例如:/ an:应用程序标题,背景颜色等。

因此。关于我的问题,以及我试图解决这个问题。

首先,这是我的MY_Controller

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Controller extends CI_Controller
{
    public $data;

    public function __construct() {

        parent::__construct();


        $this->data = array(

            'app_title'             =>  $this->settings_model->get_title('$title'),
            'meta_author'           =>  APP_AUTHOR

        );

    }

}

这是我的Settings_model:

defined('BASEPATH') OR exit('No direct script access allowed');

class Settings_model extends CI_Model
{
    public $title = '';

    public function __construct() {

        $this->load->database();

    }


    public function get_title($title) {

      $this->db->select('app_title');
      $this->db->from->('settings');
      $this->db-where('app_title', $title);

      return $this->db->get()->row('app_title');



    }


}

我的问题 使用上面的sytnax时。我能够在浏览器中看到我的应用程序输出。一切都正确呈现,我在MY_Controller中分配的所有静态变量都有效。一切都很好......除了$app_title变量(在我的视图中,并在MY_Controller中分配)不会像模型指示的那样从数据库加载数据。同时不会产生任何错误,警告或通知。

我尝试了什么 男人,我告诉你,我已经尝试了一切。我已经尝试直接将查询插入MY_Controller而不使用模型(我知道这不是适当的MVC,但我想尝试),如下所示:

MY_Controller使用Straigh Query,无模型

        $this->data = array(

            'app_title'             =>  $this->db->query('GET app_title FROM settings'),
            'meta_author'           =>  APP_AUTHOR

        );

有一次我到了某个地方,错误/通知明智的是当我改变Settings_Model时,就像这样:

更改设置模型

defined('BASEPATH') OR exit('No direct script access allowed');

class Settings_model extends CI_Model
{
    public $title = '';

    public function __construct() {

        $this->load->database();

    }


    public function get_title($title) {

      $this->db->select('app_title');
      $this->db->from->('settings');
      $this->db-where('app_title', $title);

      // Before it was this:
      return $this->db->get->row('app-title');

      // But I changed it to this
      return $this->db->get()->row()->app_title;



    }


}

但上面的语法给了我这个非对象错误的图像中的错误

enter image description here

我不知道我做错了什么。

现在问题

  1. 为什么当我使用settings_model的第一种方法时,使用return $this->db->get()->row('app_title');它会在浏览器中显示我的所有应用程序输出,但是在调用$app_title变量的任何地方,它本身都不会显示任何值数据库,通过MY_Controller和Settings_model?
  2. 为什么当我使用settings_model的第二种方法时,使用return $this->db->get()->row()->app_title;会在链接到上面的图片中产生Trying to get property of Non Object错误?
  3. 我到底在做什么?我知道我仍处于OOP和模型等的早期学习阶段。但我必须遗漏一些东西,我知道有些事情是不对的。
  4. 非常感谢和欢迎任何和所有帮助。我感谢大家的意见。

    编辑1:感谢@ Mirceac21提问。我是autoloading settings_model中的config/autoload.php。{/ p>

    编辑2:我现在已将var $data切换为public $data MY_Controller,因为@ Mirceac21建议。仍然是同样的错误,但他没有在那里使用var是正确的。

1 个答案:

答案 0 :(得分:0)

好的,所以我明白了。在@ Mirceac21的帮助下。我将var $data更改为public $data中的MY_Controller

然后在Settings_model中,我取出了WHERE条款并且它有效。以下是新的工作代码:

<强> MY_Controller

defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Controller extends CI_Controller
{
	// $data object used for $this->data
    public $data;

    public function __construct() {

        parent::__construct();

        /*
         * The $data array('KEY' => 'VALUE') variable sets are used
         * in other Controller Classes that extend MY_Controller.
         */

        $this->data = array(

            'app_title'             =>  $this->settings_model->get_title('$title'),
            'meta_author'           =>  APP_AUTHOR

        );

    }

}

然后在Settings_model我做了以下更改,请删除->where('app-title', $title);。像这样:

defined('BASEPATH') OR exit('No direct script access allowed');

class Settings_model extends CI_Model
{
    public $title = '';

    public function __construct() {

        $this->load->database();

    }


    public function get_title($title) {

      $this->db->select('app_title');
      $this->db->from->('settings');
      
	  // I removed the following where->(); and it now loads the dynamic data
	  // $this->db-where('app_title', $title);

      return $this->db->get()->row('app_title');



    }


}

现在一切都按计划进行。我知道这是一个简单而愚蠢的事情,因为缺乏更好的词汇。感谢@ Mirceac21的输入。