Codeigniter如何在没有num_rows()函数的情况下处理数据库错误

4

我在CI中遇到了处理数据库错误的简单方法的困难。例如,我不能在数据库表中插入重复的条目。如果我尝试这样做,就会收到1062数据库错误。

最常见的解决方法是检查条目是否已经存在,并在if语句中使用$query->num_rows() > 0来防止错误发生。对我来说,这种方法似乎是多余的,因为我正在执行额外的查询。理想情况下,我希望检查我的主查询是否出现错误或是否影响了某一行。

我找到了以下可能有用的函数

$this->db->affected_rows()

$this->db->_error_message()

然而,我不确定如何使用它们。在我的模型中尝试过:
$this->db->insert('subscription', $data);
return $this->db->affected_rows();

据我理解,这应该返回受影响的行数。然后在我的控制器中,我添加了以下内容:
$affected = $this->Subscribe_model->subscribe($data);

if ($affected < 1)
{
    //display error message in view
}
else
{
   $this->Subscribe_model->subscribe($data); //perform query
}

如果发生错误,脚本会在模型中的$this->db->insert('subscription', $data);处停止,并显示整个数据库错误。

2个回答

2

我不知道这是否适用于$this->db->insert();,但是$this->db->query();如果出现错误则会返回false,因此您可以进行以下操作:

$sql = $this->db->insert_string('subscription', $data);
$sql = $this->db->query($sql)
if(!$sql){
    //Do your error handling here
} else {
    //query ran successfully
}

1
尝试使用@$this->db->insert('subscription', $data);,其中@在PHP中表示“抑制警告”。
作为替代方案 - 如果您知道数据是安全的,或者愿意使用$this->db->insert_string,您可以在查询的末尾添加on duplicate key
这应该可以工作(未经测试):
$this->db->simple_query( $this->db->insert_string( 'subscription', $data ) . 
                            ' ON DUPLICATE KEY ' . 
                            $this->db->update_string( 
                                        'subscription', 
                                         $data, 
                                         /* your where clause here */ );

谢谢!在查询中使用IGNORE也是一个好的解决方案吗?我试图尽量减少数据库查询,如果重复行已经存在。 - CyberJunkie
1
当然,我会这样做str_replace('INSERT','INSERT IGNORE',$this->db->insert_string('subscription',$data)); - cwallenpoole
1
你也可以使用 query 来实现此操作。 simple_query 虽然在需要最小处理时很有用,但并不像 query 做的那么多。 - cwallenpoole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接