首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CodeIgniter num_rows和affected_rows context

CodeIgniter num_rows和affected_rows context
EN

Stack Overflow用户
提问于 2013-01-25 23:20:33
回答 4查看 11.3K关注 0票数 2

这个问题可能有点傻,但我不明白:

我的模型中有这两个函数

代码语言:javascript
复制
public function count()
{
    return $this->db->num_rows();
}

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

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

控制器中的代码如下所示:

代码语言:javascript
复制
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);
                    }

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-26 00:28:53

下面是我如何正确地修复这个问题。

而不是这个函数:

代码语言:javascript
复制
public function check_account_already_exists($email_address)
{
    if ($query = $this->db->query('SELECT * FROM account WHERE email_address = ?', array($email_address)))
    {
        return true;
    }
}

我有这个函数:

代码语言:javascript
复制
public function check_account_already_exists($email_address)
{
    if ($query = $this->db->query('SELECT * FROM account WHERE email_address = ?', array($email_address)))
    {
        return $query;
    }
}

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

代码语言:javascript
复制
 // 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语句仍将以相同的方式工作。

票数 1
EN

Stack Overflow用户

发布于 2013-01-25 23:30:41

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

代码语言:javascript
复制
$query = $this->db->query('SELECT * FROM my_table');
echo $query->num_rows();

正如您在这里看到的,我们调用的不是$this->db->num_rows(),而是$query->num_rows();

作为变通办法,您可以将query对象传递给count()方法,如下所示:

代码语言:javascript
复制
public function count($query)
{
    return $query->num_rows();
}

更新:

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

我假设查询是在synchronization_model中执行的。在这种情况下,你应该做的是。在synchronization_model中有一个变量,比如row_count。并将num_rows()返回的值放入此变量中。count()中的只返回这个变量。因此,它将类似于:

synchronization_model内幕

代码语言:javascript
复制
......
$query = $this->db->query('SELECT * FROM my_table');
$this->row_count = $query->num_rows();
......    
public function count()
{
    return $this->row_count;
}
......
票数 1
EN

Stack Overflow用户

发布于 2013-01-25 23:23:00

代码语言:javascript
复制
$this->db->num_rows();

返回结果在选择时所读取的行数,则需要将此用作

代码语言:javascript
复制
   $query = $this->db->get('table');

             OR           

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

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

是否返回更新、删除或插入时受影响的行

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14524832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档