我正在创建一个这样的模型对象:$ object1 = new Object1();数据库中有一个名为object1s的表。 Object1类是一个扩展DataMapper的空类。这没有问题。我能够保存数据,并从数据库中检索数据(我可以使用单独的数据库客户端查看它)。
我尝试用另一个对象(和另一个表)做同样的事情,例如,$ object2 = new Object2();这次我收到以下错误消息:
致命错误:在第6049行的/Applications/XAMPP/xamppfiles/htdocs/c/application/libraries/Datamapper.php中调用非对象的成员函数行()
第6049行看起来像这样:
返回$ this-> lang-> line($ key);
当我实例化Object1时,此时将$ this-> lang设置为DM_Lang的实例,但是当实例化第二个对象时,$ this-> lang设置为“en”。两者之间的唯一区别是名称和数据库表。
我该怎么做才能解决这个问题?他们为什么不同?设置$ this-> lang在哪里(我已经使用调试器进行了操作但无法找到它)?
数据库是MySQL。我正在MacOSX Lion上进行开发。 Web服务器是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附带的安装说明进行操作。我的index.php文件在加载CodeIgniter引导程序文件之前包含以下内容。
/* --------------------------------------------------------------------
* LOAD THE DATAMAPPER BOOTSTRAP FILE
* --------------------------------------------------------------------
*/
require_once APPPATH.'third_party/datamapper/bootstrap.php';
使用Movie对象可以很顺利地工作。我能够向它写入数据并使用单独的SQL查询工具验证它是否存在。
我刚注意到,如果“$ movie = ...”行被注释掉,“$ image = ...”行就会运行而没有错误。但是,我需要它们才能使我的应用程序正常运行。
我正在使用CI_VERSION = 2.1.0。
感谢您的帮助。
答案 0 :(得分:2)
在切换到CodeIgniter之前已使用数据库架构。第一个表有名称冲突(它使用“lang”作为字段名称)。第二个表没有冲突,并且失败只是因为它是具有问题的模型对象之后的下一个DataMapper子类实例化。我的注意力集中在失败的桌子/模型上,而实际上它是成功的那个有问题的。
修复是检查所有模型对象是否存在冲突,而不仅仅是失败的模型对象。