CodeIgniter num_rows和affected_rows上下文

时间:2013-01-25 15:20:33

标签: php mysql codeigniter

这可能是一个有点愚蠢的问题,但我不明白:

我的模型中有这两个函数

public function count()
{
    return $this->db->num_rows();
}

public function changes()
{
    return $this->db->affected_rows();
}

当我在控制器中调用changes();时,它会显示最后一次(更新)查询的受影响行。当我使用count();显示最后一个(选择)查询的行时,我收到错误..

控制器中的代码是这样的:

if (!$this->synchronization_model->get_contact_knowledge($contact['account_id'], SERVER_LOCATION_ID)) {
                        throw new Exception("Failed to update knowledge");
                    }

                    if( $this->synchronization_model->count() == 0) {
                        $this->synchronization_model->insert_knowledge($contact['account_id'], $contact_server_time);
                    }

有没有办法解决或解决这个问题?

4 个答案:

答案 0 :(得分:1)

num_rows()不是db类的方法。它应该针对resultset对象进行调用。

$query = $this->db->query('SELECT * FROM my_table');
echo $query->num_rows();

如您所见,我们不会致电$this->db->num_rows()而是致电$query->num_rows();

作为一种解决方法,您可以将查询对象传递给count()方法,如下所示:

public function count($query)
{
    return $query->num_rows();
}

<强>更新

根据您更新的代码,我建议如下:

我假设查询是在synchronization_model中执行的。在那种情况下,你应该做的是。请synchronization_model中的变量说row_count。并将num_rows()返回的值放入此变量中。 count()中的内容只返回此变量。所以它会是这样的:

内部synchronization_model

......
$query = $this->db->query('SELECT * FROM my_table');
$this->row_count = $query->num_rows();
......    
public function count()
{
    return $this->row_count;
}
......

答案 1 :(得分:1)

以下是我如何正确修复此问题。

而不是这个功能:

public function check_account_already_exists($email_address)
{
    if ($query = $this->db->query('SELECT * FROM account WHERE email_address = ?', array($email_address)))
    {
        return true;
    }
}

我有这个功能:

public function check_account_already_exists($email_address)
{
    if ($query = $this->db->query('SELECT * FROM account WHERE email_address = ?', array($email_address)))
    {
        return $query;
    }
}

所以当我在控制器中调用它时:

 // Check whether the e-mail address has not already been taken
        if (!($count = $this->account_model->check_account_already_exists($email_address))) {
          throw new Exception("Failed to fetch account");
        }

       $this->account_model->count($count);

我可以这样使用..这样,上面的if语句仍然可以以相同的方式工作。

答案 2 :(得分:0)

$this->db->num_rows();

返回结果在选择时获取的数量的行数,您将需要使用此作为

   $query = $this->db->get('table');

             OR           

   $query = $this->db->query('select * from table');
   $query->num_rows();

return $this->db->affected_rows();

返回更新,删除或插入时受影响的行

相关代码在哪里,以便我们可以看到它。

答案 3 :(得分:0)

在CodeIgniter中,num_rows()函数是查询对象的方法,而不是数据库对象...请参阅http://ellislab.com/codeigniter/user-guide/database/results.html

例如,您可以通过以下方式使用num_rows()

$query = $this->db->query("SELECT * FROM some_table WHERE some_col = 'blah'");

if($query->num_rows()){
    //yay, data!
} else {
    //no data for you
}