codeigniter数据库错误处理

时间:2011-05-26 14:06:31

标签: database codeigniter error-handling

控制器:

function edit($id)
{
    $this->form_validation->set_rules('name', 'Name', 'required|xss_clean');

    $this->load->model('manager_model');

    $pageData['type'] = 'managers';
    $pageData['title'] = "Edit Manager";
    $data['records'] = $this->manager_model->getManager($id);

    $this->load->view('header', $pageData);
    $this->load->view('db_options_view', $pageData);

    if ($this->form_validation->run() == FALSE)
    {
        $this->load->view('managers/editManagerForm_view', $data);
    }
    else
    {   
        $name = $this->input->post('name');

        $this->manager_model->updateRecord($id, $name);

        $this->load->view('managers/editManagerSuccess_view');
    }

        $this->load->view('footer');
}   

型号:

function updateRecord($id, $name)
{
    $data = array('name' => $name);
    $this->db->where('id', $id);
    $this->db->update('manager', $data);
}

我的问题是这个。我的数据库表不接受名称字段的重复值。因此,当我测试它时,我输入了一个重复的名称,codeigniter返回以下内容:

发生数据库错误 错误号码:1062 键2的重复输入'alan pardew' 更新manager SET name ='alan pardew'WHERE id ='2' 文件名:/var/www/vhosts/mysite.com/httpdocs/personal/models/manager_model.php 行号:74

我想在控制器中自己处理这个错误,并且我已经做了一些阅读,发现我必须设置$db['default']['db_debug'] = FALSE;以防止codeigniter显示错误。

是否只是关闭特定错误,例如重复发送?

或者你会建议完全关闭它们吗?

另外......我对codeigniter相当新,所以如果你能发现我的代码中的任何不良做法,请随意指出它!

2 个答案:

答案 0 :(得分:3)

如果您正在使用MYSQL,则可以使用“INSERT IGNORE ...”处理重复的密钥(尝试插入,如果发生错误,请将其缩小为警告,以便查询无提示失败),“REPLACE INTO .. msgstr“插入,如果发生重复键错误,则用旧文件替换旧记录”或“INSERT ... ON DUPLICATE KEY UPDATE ...”(插入,如果发生重复键错误,则取消插入并执行更新关于旧行的陈述)

例如:

INSERT INTO log(id_page, view_count) VALUES (123, 1) ON DUPLICATE KEY UPDATE view_count = view_count + 1

可悲的是,代码点火器的活动记录库不允许你使用它,据我所知,所以最简单的方法是处理它只是选择记录,看它是否已经存在,然后插入它(或者您可以在没有活动记录的情况下自己执行查询,并检查它是否返回错误代码)。

答案 1 :(得分:2)

签入数据库CI帮助:

您可以编写回调函数并在验证行中使用它;

$this->form_validation('field','fieldname','required|callback_check');

该功能将是这样的

function check($str){
    if($str exist in database){
       $this->form_validation->set_message('check','nickname in use');
       return false;
    }
    return true;
}