CodeIgniter会话错误:脚本尝试执行方法或访问不完整对象的属性

时间:2014-09-09 02:13:13

标签: php codeigniter session

尝试从会话中存储的数据调用对象时,我遇到了CodeIgniter的问题。

代码:

public function do_index_1 ()
{   
    $tags= $this->input->post('tags');  
    $data['recommendation_for_you_unlimited']=$this->db->query
        ("SELECT *, MATCH(tags, message) AGAINST ('$tags') as score 
        FROM game
        WHERE MATCH(tags, message) AGAINST ('$tags')
        ORDER BY score
        "); 
    $data['recommendation_num'] = $this->db->get('game')->num_rows();
    $this->session->set_userdata($data);
}

public function do_index_3 ()
{
    $data['recommendation_num'] = $this->session->userdata('recommendation_num');
    $data['recommendation_for_you_unlimited'] = $this->session->userdata('recommendation_for_you_unlimited');
}

数据存储在do_index_1中的会话变量中,并在do_index_3中显示。第一个变量$data['recommendation_num']输出正常,但第二个$data['recommendation_for_you_unlimited']触发错误:

The script tried to execute a method or access a property of an incomplete object.

我在这里和那里搜索过,发现可能是因为$data['recommendation_for_you_unlimited']是一个对象。但我不确定如何解决它。

1 个答案:

答案 0 :(得分:1)

$this->db->query()返回一个对象(特定对象取决于您使用的CodeIgniter的数据库驱动程序)。我认为你的意思是使用$this->db->query()->result()作为查询的结果返回一个行数组。

请改用以下内容:

$data['recommendation_for_you_unlimited'] = $this->db->query
    ("SELECT *, MATCH(tags, message) AGAINST ('$tags') as score 
    FROM game
    WHERE MATCH(tags, message) AGAINST ('$tags')
    ORDER BY score")->result();

您获得的错误是尝试在userdata中存储类的结果。使用$this->session->set_userdata()存储内容时,传递的数据将序列化为字符串。当使用$this->session->userdata()稍后检索它时,它会被反序列化回原始数据。对于某些数据类型(例如类),最终会丢失无法正确序列化的内容。

我的建议是远离在userdata中存储类或对象(或PHP的$ _SESSION,因为它做同样的事情)。但是,您可以存储只具有属性的简单对象,而不会出现问题。

在这种情况下,看起来你似乎缺少->result()

以下是有关在CodeIgniter中生成查询结果的文档

以下是CodeIgniter的Active Record及其Session类的文档:

以下是$ _SESSION如何运作的基本文档