Проблема Codeigniter с контроллером и моделью - PullRequest
1 голос
/ 18 декабря 2010

Я использую 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.

А вот соответствующий код модели (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 () для необъекта в /www/development/sunrise_ci/00ci00/application/init/siteObj.php в строке 9

ОБНОВЛЕНИЕ: Я следовал совету первого респондента, но это не помогло.

С тех пор я удалил все ссылки на подключение к базе данных, пытаясь изолировать проблему. Когда я просто пытаюсь вызвать функцию 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();
        }
    }

Это вызывает объект init, который я настроил в application / init / siteobj.php. Вот этот код:

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

Заранее спасибо!

Gary

1 Ответ

2 голосов
/ 18 декабря 2010

Обновление на основе обновленного кода в исходном вопросе :

Имейте в виду, что класс перехватчиков CodeIgniter инициализируется до класса загрузчика, поэтому ваш хук pre_controller создает экземпляр SiteObj и пытается вызвать Site_model->create_site() до того, как Site_model был загружен через класс загрузчика.

Выдает ошибку, потому что вы не можете вызвать метод для объекта, который еще не существует. В данном случае Site_model - это объект, который еще не существует.

Помните, что вы можете проверить свои файлы журналов (расположены в / system / logs /), чтобы увидеть порядок, в котором выполняются ресурсы. Также может быть полезно ознакомиться с блок-схемой приложений CodeIgniter .

Надеюсь, это поможет!

Окончание обновления

Метод 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 контроллере:

$this->load->model('Site_model');

$data = $this->Site_model->create_site();

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

Надеюсь, это поможет - если нет, дайте мне знать. Не похоже, что ваш код слишком далеко! Для справки ознакомьтесь с методом num_rows () и методом row () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...