【问题标题】:Codeigniter Undefined property: xxxx_model::$db only from ModelCodeigniter 未定义属性:xxxx_model::$db 仅来自模型
【发布时间】:2011-09-18 22:03:17
【问题描述】:

首先是模型类:

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

      function isInDatabase()
      {
        // Please ignore the sql query, it's just to show some random sql code with results
11.      $result = $this->db->query('SELECT * FROM someTable WHERE ...');
        $numberOfRows = $result->num_rows();
        ... 
        return $test;
      }
    }

现在是控制器:

function someLogic()
{
  $this->load->model('xxxx_Model', 'xxxxModel'); // not necessary to specify
  $this->xxxxModel->isInDatabase();
}

当我运行它时,我得到了错误:

Severity: Notice  --> Undefined property: Xxxx_model::$db .../xxxx_model.php line 11

我不知道这是为什么。如果我将 db 代码放在控制器中,它似乎可以工作,只有在模型中使用此设置才会失败。我一生都无法弄清楚代码在哪里误入歧途......

【问题讨论】:

    标签: database codeigniter view


    【解决方案1】:

    您必须先加载 db 库。在autoload.php 中添加以下代码,

    $autoload[‘libraries’] = array(‘database’);
    

    【讨论】:

    • 提问的人已经用过$this->load->database(); .所以我认为不需要自动加载。
    【解决方案2】:

    将库“数据库”添加到自动加载。

    /application/config/autoload.php

    $autoload['libraries'] = array( 'database' );

    可能你像我一样开始了新项目;-)

    【讨论】:

    • 完美!我正在开始一个新项目
    【解决方案3】:

    添加到atno的答案:

    class Xxxx_model extends Model
    {
      function XxxxModel() //<--- does not match model name Xxxx_model
      {
        parent::Model();
        $this->load->database();
      }
    

    基本上,您没有构造类父类Model。如果您使用的是 PHP5,则可以使用 __construct(),否则您必须与类名完全匹配,无论您在控制器中使用什么别名加载它。示例:

    class Xxxx_model extends Model
    {
      function __construct()
      {
        parent::__construct(); // construct the Model class
      }
    }
    

    我可能记错了(有一段时间没用1.x了),但是如果你构造Model类,如果你使用config/database.php中的默认连接设置,就不需要加载数据库,它应该已经为你加载了。

    【讨论】:

    • 事实上,如果$this-&gt;db 可用并且如前所述在控制器中工作,而没有按预期由模型加载,则绝对不需要加载数据库。
    • 我不敢相信我错过了构造函数的名称!那是残酷的。由于时间表的原因,我一直在进行 36 多个小时的编码狂欢。这绝对是问题之一。我必须更改模型的名称才能根据文档正确加载它,我想我也错过了重构构造函数的名称。
    • 顺便说一句,如果我调整构造函数的名称,我就不必再自动加载数据库了。是的:)
    • @StephaneGrenier:打开一些死亡金属,煮些咖啡来唤醒你 :) 另外,绝对值得有一天检查一下当前的 2.x,这是一个非常简单的升级过程,文档是也好一点。
    • 我正在考虑,但我的截止日期也很紧,根本没时间升级。我很快就会研究它,看看除了版本号增加之外还有什么新的和令人兴奋的;)这是一个很棒的框架,这是肯定的。
    【解决方案4】:

    如果function XxxxModel() 不是您的构造函数,则您不会通过调用$this-&gt;xxxxModel-&gt;isInDatabase(); 来加载数据库

    尝试从autoload.php 中自动加载数据库库,或在您的模型中创建适当的构造函数。

    【讨论】:

    • 如果是这种情况,他会有不同的错误(即找不到类模型),但否则你是正确的。
    • +1 到您的编辑 - 很好。我确信 OP 会回来并声称这是一个错字,我看不出隐藏型号名称的原因,Xxxxx 几乎不可读。
    • 如果我只在几个地方需要它,为每个 url 自动加载它不会有性能成本吗?顺便说一句,确实解决了它。
    • 是的,如果您不需要在每个页面上都连接数据库,那么性能会受到很小的影响。如果仅在放置时才需要它,则可以创建一个 MY_DB_Model 类,该类将扩展 Model 并包括数据库加载。每次您需要从数据库中获取数据时都扩展该模型,否则 CI 的 Model。请标记解决您问题的正确答案。
    • @StephaneGrenier:如果$this-&gt;db 在您的控制器中工作但模型已损坏,则您已经加载了数据库...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多