尝试从会话中存储的数据调用对象时,我遇到了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']
是一个对象。但我不确定如何解决它。
答案 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如何运作的基本文档