即使在更新后,CI affected_rows也始终返回0

时间:2016-06-21 02:33:53

标签: php codeigniter model

我使用Codeigniter 3.0.6构建系统。 通常,我使用affected_rows()来检查我的数据库是否已更新。

    function update($id=0,$data=array())
    {
        $this->db->where($this->key, $id);
        $this->db->update($this->table,$data);
        if($this->db->affected_rows() > 0)return TRUE;
        else return FALSE;
    }

问题是如果没有找到更新,它也将返回0。由于我想在我的代码中区分更新和无更新,所以我使用此解决方案。

    function update($id=0,$data=array())
    {
        $this->db->trans_start();
        $this->db->where($this->key, $id);
        $this->db->update($this->table,$data);
        $this->db->trans_complete();
        if ($this->db->affected_rows() > 0) {
            return TRUE;
        } else {
            if ($this->db->trans_status() == FALSE) {
                return FALSE;
            }
            return 'No Update';
        }
    }

但即使更新后的affected_rows总是返回int(0)。 什么原因?谢谢。

2 个答案:

答案 0 :(得分:0)

我也使用CI 3.0.6而且affected_rows()会返回正确数量的更新行。

你可以在没有交易的情况下进行测试。像这样的东西?

function update($id)
{
    $this->db->set('field_name', "new_value");
    $this->db->where('id', $id);
    $this->db->update('table_name');

    $rows = $this->db->affected_rows();

    return $rows;
}

验证数据库中是否实际更新了记录。您可以检查$ rows以获取更新状态。

if ($rows < 1) {
    // no update
} else {
    // updated
}

答案 1 :(得分:0)

如果将$this->db->affected_rows()移到$this->db->trans_complete();之前,您将获得预期的计数。由于affected_rows()仅检查问题中的最后一条语句$this->db->trans_complete();,因此将返回0

您可以通过在$this->db->affected_rows()之前将$this->db->trans_complete();分配给另一个变量并稍后进行验证来解决此问题。

function update($id=0,$data=array())
{
    $this->db->trans_start();
    $this->db->where($this->key, $id);
    $this->db->update($this->table,$data);
    $affected_rows = $this->db->affected_rows(); // moved to here from if condition
    $this->db->trans_complete();
    if ($affected_rows > 0) {
        return TRUE;
    } else {
        if ($this->db->trans_status() == FALSE) {
            return FALSE;
        }
        return 'No Update';
    }
}