与控制器和模型的Codeigniter问题

时间:2010-12-18 01:00:31

标签: php codeigniter model controller

我正在使用codeigniter 1.7.3并且我已经设置并运行了控制器,但是当我尝试通过控制器访问模型时,我无法获取查询结果。

我在配置区域中正确配置了数据库(我知道这一点,因为当我故意弄乱其中一个配置选项时,我收到一条消息,说无法访问数据库。)

这是相关的控制器(SiteObj.php)代码:

class SiteObj extends Controller {
     function __construct() {
          parent::Controller();
          $this->load->model('Site_model');
          $data['query'] = $this->Site_model->create_site();

          if ($data->num_rows() == 1) {
             //etc. etc.

这是相关的Model(site_model.php)代码:

class Site_model extends Model {
    function __construct() {
        parent::Model();
        $this->load->database();
    }

    function create_site(){
        $query = $this->db->query("SELECT * FROM sites WHERE siteid = '1' LIMIT 1");

        if ($query->num_rows() > 0) {
         $row = $query->row();
         return $row;
             // etc etc

我也试过命名初始函数Site_model而不是构造函数,但没有运气。我还尝试通过autoload.php文件自动加载数据库,还通过在create_site函数本身而不是构造函数中加载数据库。

以下是我收到的错误消息:

致命错误:在非对象中调用成员函数num_rows() 第9行/www/development/sunrise_ci/00ci00/application/init/siteObj.php

更新:我按照第一响应者给出的建议,但这没有帮助。

我已经删除了对数据库连接的所有引用,试图找出问题所在。当我只是尝试从控制器中调用create_site()函数时,我得到了这个:

Undefined property: SiteObj::$Site_model
Fatal error: Call to a member function create_site() on a non-object

所以似乎问题出现在控制器和模型之间,不知怎的,它们似乎并没有正确地相互“交谈”。有趣的是,我能够看到我可以通过create_site()将值传递给控制器​​,但我仍然会收到错误消息。

** * * 更新12/18 * ** * ** * ** *

好的,首先,我修改了application / config / hooks.php文件,以便我可以在所有页面调用之前预先加载我的初始化代码。所以这个页面有这个:

$hook['pre_controller'][] = array(
        'class'    => 'SiteObj',
        'function' => '__construct',
        'filename' => 'siteObj.php',
        'filepath' => 'init'
    );

接下来,我有一个处理所有页面调用的默认控制器。它位于controllers / page.php,这是代码:

class Page extends Controller {
        // I am the core controller for the application.
        function _remap() {
            $mysite = new SiteObj();
        }
    }

这会调用我在application / init / siteobj.php中设置的init对象。这是代码:

class SiteObj extends Controller {
        function __construct() {
            parent::Controller();
            $this->load->model('Site_model');
            $data = $this->Site_model->create_site();
            if ($data){
                $this->siteid = $data->siteid;
            } else {
                $this->siteid = 0;
            }
        }
    }

最后,这是models / site_model.php中的模型代码:

class Site_model extends Model {
        function Site_model() {
            parent::Model();
            $this->load->database();
        }

        public function create_site(){
            // I load the site data from the database and send the result to the controller
            $query = $this->db->query("SELECT * FROM sites WHERE siteid = '1' LIMIT 1");
            if ($query->num_rows() == 1) {
                return $query->row();
            }
        }
    }

我收到此错误:

Undefined property: SiteObj::$Site_model
Fatal error: Call to a member function create_site() on a 
non-object in 
/www/development/sunrise_ci/00ci00/application/init/siteObj.php 
on line 7

提前致谢!

加里

1 个答案:

答案 0 :(得分:2)

根据原始问题中的更新代码进行更新

请记住CodeIgniter的Hooks类在 Loader类之前初始化,因此pre_controller挂钩正在实例化SiteObj并尝试在之前调用 em> Site_model->create_site()已通过Loader Class加载。

它抛出错误,因为您无法在尚不存在的对象上调用方法。在这种情况下,Site_model是尚不存在的对象。

请记住,您可以检查日志文件(位于/ system / logs /中)以查看执行资源的顺序。查看CodeIgniter Application Flow Chart

也可能会有所帮助

希望有所帮助!

结束更新

Site_model方法只能用于整个num_rows()结果对象,就像您在$query中一样:

Site_model

但是,目前$query = $this->db->query("SELECT * FROM sites WHERE siteid = '1' LIMIT 1"); if ($query->num_rows() > 0) { // do stuff } 中的create_site()方法正在从结果对象返回单行Site_model),然后您正在尝试在return $row;控制器中的该行上调用num_rows()

确实没有必要这样做,因为SiteObj将始终返回单个结果行。

如果您确实想要从控制器内部调用$query->row();(再次,由于num_rows()始终只返回一行,确实没有意义),您必须返回整个$query->row()像这样的结果对象:

$query

然后在你的$query = $this->db->query("SELECT * FROM sites WHERE siteid = '1' LIMIT 1"); if ($query->num_rows() > 0) { return $query; } 控制器中:

SiteObj

希望有所帮助 - 如果不让我知道。它看起来不像你的代码太远了!如需参考,请查看num_rows() methodrow() method