2011-05-26 91 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