2011-05-26 65 views
2

控制器:笨数据库错误处理

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); 
} 

我的问题是这样的。我的数据库表不接受名称字段的重复值。所以,当我在测试它,我进入了一个重复的名称和笨返回以下:

数据库出错 错误号码:1062 重复项“阿兰·帕杜”的关键2 UPDATE manager SET name =“阿兰·帕杜” WHERE id = '2' 文件名:/var/www/vhosts/mysite.com/httpdocs/personal/models/manager_model.php 行号:74

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

有没有办法只是把特定的错误,如重复entrys?

或者你会推荐完全关闭它们吗?

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

+0

这是字面上我的确切情况。干杯救我一份工作! – JackalopeZero 2012-10-07 13:27:31

+0

关于此主题的另一个重要问题是:“如果您通过PHP循环遍历许多插入,例如,如果在CI中关闭数据库错误,将继续执行,还是执行停止而不会仅仅打印错误消息? – axiom82 2014-03-14 01:47:05

回答

3

如果您使用的是MYSQL,您可以使用“INSERT IGNORE ...”处理重复键(尝试插入,如果发生错误将其降低为警告,以使查询无提示失败)“REPLACE INTO。 ..“(插入,如果发生重复键错误,则用新的记录替换旧记录)或”INSERT ... ON DUPLICATE KEY UPDATE ...“(插入,如果发生重复键错误,则取消插入并执行在旧的行更新语句)

对于为例:

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

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

2

要检查数据库中的CI帮助:

你可以写一个CALLBACK_FUNCTION和验证前的行中使用它;

$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; 
} 
+0

[这](http://net.tutsplus.com/tutorials/php/6-codeigniter-hacks-for-the-masters/)页面也描述了如何做。 – twnaing 2011-12-02 02:57:30