3

我正在创建一个这样的模型对象: $object1 = new Object1(); 数据库中有一个名为 object1s 的表。Object1 类是一个扩展 DataMapper 的空类。这没有问题。我能够保存数据,并从数据库中检索数据(我可以使用单独的数据库客户端查看它)。

我尝试对另一个对象(和不同的表)做同样的事情,例如,$object2 = new Object2(); 这次我收到以下错误消息:

致命错误:在第 6049 行的 /Applications/XAMPP/xamppfiles/htdocs/c/application/libraries/Datamapper.php 中的非对象上调用成员函数 line()

第 6049 行如下所示:

返回 $this->lang->line($key);

当我实例化 Object1 时,此时 $this->lang 被设置为 DM_Lang 的一个实例,但在实例化第二个对象时,$this->lang 被设置为“en”。两者之间的唯一区别是名称和数据库表。

我能做些什么来解决这个问题?为什么它们不同?$this->lang 设置在哪里(我已经使用调试器逐步完成但找不到它)?

数据库是 MySQL。我在 MacOSX Lion 上运行它是为了开发目的。网络服务器是 apache。我正在使用 DataMapper ORM v1.8.2。


有一条评论要求提供有问题的确切代码。这是我测试的完整代码(我从每个文件中复制并粘贴)。

Object1 被称为 Movie,models/movie.php:

<?php

class Movie extends DataMapper {

}

对象 2 称为 Image,models/image.php:

<?php

class Image extends DataMapper {

}

控制器看起来像这样,controllers/test.php:

<?php

class Test extends CI_Controller {

    public function newdata()
    {
        // The following line runs as expected
        $movie = new Movie();
        // The following line fails with the Fatal error mentioned above
        $image = new Image();

    }

}

我按照 DataMapper v1.8.2 附带的安装说明进行操作。在加载 CodeIgniter 引导文件之前,我的 index.php 文件包含以下内容。

/* --------------------------------------------------------------------
 * LOAD THE DATAMAPPER BOOTSTRAP FILE
 * --------------------------------------------------------------------
 */
        require_once APPPATH.'third_party/datamapper/bootstrap.php';

它与 Movie 对象配合得非常顺利。我能够向其中写入数据并使用单独的 SQL 查询工具验证它是否存在。

我刚刚注意到,如果“$movie = ...”行被注释掉,“$image = ...”行运行没有错误。但是,我需要它们两者才能使我的应用程序正常运行。

我正在使用 CI_VERSION=2.1.0。

谢谢您的帮助。

4

1 回答 1

2

在切换到 CodeIgniter 之前已经使用了数据库模式。第一个表有名称冲突(它使用“lang”作为字段名称)。第二个表没有冲突,并且失败只是因为它是出现问题的模型对象之后的下一个 DataMapper 子类实例化。我的注意力集中在失败的桌子/模型上,而实际上是成功的桌子/模型出现了问题。

解决方法是检查所有模型对象是否存在冲突,而不仅仅是失败的模型对象。

于 2012-05-15T22:11:10.327 回答