我是codeigniter和MVCOOP方法的新手,所以我已经接受了这样一个事实,即这是我犯的一个错误,不太可能是我自己的代码之外的问题。
我有一个控制器(Purchase_Order(,可以加载2个模型(Product_m和Supplier_m(+其他。
我构建了一个自定义MY_Model它采用 0 个参数并根据模型设置(table_name、primary_key 等(生成查询。
在我的本地实例(Wamp(中,它运行良好。 一旦我上传到实时网络服务器(Linux(,我就会收到以下错误;
Fatal error: Call to a member function result() on a non-object in (MY_Model.php on line 58)
.
我有另一个控制器(用户(,它加载模型(User_m(并通过相同的MY_Model路由传递,并且可以在线和本地完美运行。
我只能假设我有一个范围问题或类似的东西,但我在过去的 48 小时内痴迷于修复无济于事。
我真的希望有人能抽出时间在这个问题上启发我。
MY_Model
class MY_Model extends CI_Model {
//Vars
protected $_table_name = '';
protected $_primary_key = 'id';
protected $_primary_filter = 'intval';
protected $_order_by = '';
public $_rules = array();
//protected $_timestamps = FALSE;
//Constructor
function __construct() {
parent::__construct();
}
// GET
public function get($id = NULL, $single = FALSE) {
if($id != NULL){
$filter = $this->_primary_filter;
$id = $filter($id);
$this->db->where($this->_primary_key, $id);
$method = 'row';
}
elseif($single == TRUE){
$method = 'row';
}
else{
$method = 'result';
}
if(!count($this->db->ar_orderby)){
$this->db->order_by($this->_order_by);
}
//echo var_dump($this);
return $this->db->get($this->_table_name)->$method();
//die('<pre>'.print_r($this->db, true).'</pre>');
}
删除了其他类,因为它们不是问题的一部分。
非常感谢所有人,但最终@rojoca作为相关问题:Looks like $this->db->get($this->_table_name) is returning null. Do you have $db['default']['db_debug'] set to FALSE? It's possible you have some database connection error.
让我找到了答案;
我之前曾将实时 DBase 导出到本地实例以测试它工作正常,这让我相信这不是问题所在。
我正在为实时站点使用不同的数据库配置设置,该站点确实db_debug设置为 FALSE。 重新打开它很快发现我正在使用的 Web 服务器/服务已强制表名称为小写。 我完全没有意识到这一点,我以前也从未听说过这种强迫方法。
为我吸取的教训。 再次感谢有关此问题的所有帮助。 对于这个答案,所有的功劳都应该归于@rojoca。谢谢 - 睡眠时间:)
发生这种情况时,这意味着编码点火器无法在您的数据库表中找到字段(这对我来说已经发生过几次(。从理论上讲,该解决方案将创建缺少的字段。
为了解决此错误,我使用一个小解决方案:
<?php
public function test($op)
{
$this->db->where('op', $op);
$result = $this->db->get('test');
return ($result instanceof CI_DB_mysql_result) ? $result->result() : false;
}
在这里,我们检查变量是否是CI_DB_mysql_result的实例。发生此错误的原因是该方法不返回此类的实例!!
对不起,我不会说英语。 :)