我使用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)。 什么原因?谢谢。
答案 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';
}
}