在非对象上调用成员函数num_rows()

时间:2010-04-03 20:23:44

标签: oop codeigniter

我需要获取查询的行数(因此我可以对结果进行分页)。

当我正在学习codeigniter(和OO php)时,我想尝试将一个 - > num_rows()链接到查询,但它不起作用:

//this works:
$data['count'] = count($this->events->findEvents($data['date'], $data['keyword']));

//the following doesn't work and generates
// Fatal Error: Call to a member function num_rows() on a non-object
$data['count2'] = $this->events->findEvents($data['date'], $data['keyword'])->num_rows();

模型返回一个对象数组,我认为这就是为什么我不能在它上面使用方法的原因。

function findEvents($date, $keyword, $limit = NULL, $offset = NULL)
{
    $data = array();

    $this->db->select('events.*, venues.*, events.venue AS venue_id');
    $this->db->join('venues', 'events.venue = venues.id');

    if ($date)
    {
        $this->db->where('date', $date);
    }

    if ($keyword)
    {
        $this->db->like('events.description', $keyword);
        $this->db->or_like('venues.description', $keyword);
        $this->db->or_like('band', $keyword);
        $this->db->or_like('venues.venue', $keyword);
        $this->db->or_like('genre', $keyword);
    }

    $this->db->order_by('date', 'DESC');
    $this->db->order_by('events.priority', 'DESC'); 
    $this->db->limit($limit, $offset); //for pagination purposes
    $Q = $this->db->get('events');
    if ($Q->num_rows() > 0)
    {
        foreach ($Q->result() as $row)
        {
            $data[] = $row;
        }
    }

    $Q->free_result();
    return $data;
}   

我可以做些什么来使用它吗? EG,而不是$ data [] = $ row;我应该使用另一种(OO)语法?

1 个答案:

答案 0 :(得分:1)

你的函数findEvents返回你在开始时声明为数组的$ data。这不是对象,不允许您使用成员访问语法访问函数。

要计算数组中值的数量,请参阅count

另外,根据我的理解,您不仅希望将查询结果作为数组返回,而且您希望能够访问结果上的方法$ Q = $ this-> db-> get('events' );但是这是不可能的,因为这是一个局部变量,并且它没有被退回。这里的函数有一个结果类型的数组,不是一个对象,因此无法访问任何东西,但是数组。解决此问题的一种方法是返回一个关联数组:

return array("results" => $data, "count" => $Q->num_rows());

然后使用数组语法访问计数或结果。另一个选择是返回一个具有结果和计数字段的新对象,并使用访问器方法来获取这些字段。