2009-04-09 43 views
5

Tôi có một bảng có khóa duy nhất (date + userid) trong cơ sở dữ liệu ứng dụng web của mình. Khi tôi cố gắng chèn bản ghi với hiện dateuserid tôi nhận được lỗi sau:Thực tiễn tốt nhất để xử lý lỗi từ cơ sở dữ liệu trong CodeIgniter

dupicate key in table 

Tôi bật gỡ lỗi cơ sở dữ liệu trong ứng dụng cấu hình, bởi vì tôi cần thiết để sử dụng số lỗi MySQL và tin nhắn. Bây giờ tôi cần xử lý lỗi này. Tôi có thể sử dụng hằng số được mã hóa cứng trong bộ điều khiển, nhưng tôi nghĩ đó không phải là ý tưởng hay. Tôi cần xử lý lỗi cơ sở dữ liệu ở nhiều nơi, và tôi không thích xử lý lỗi của CodeIgniter. Thực tiễn tốt nhất liên quan đến việc xử lý các lỗi cơ sở dữ liệu là gì.

Trả lời

9

Chúng tôi sử dụng trong công trình xây dựng dự án của chúng tôi như thế này:

$this->db->_error_number(); 
$this->db->_error_message(); 

nhưng chức năng không có giấy tờ này và trong phiên bản tiếp theo này có thể thay đổi. Tất nhiên bạn chỉ có thể sử dụng php chuẩn cho chức năng xử lý lỗi mysql:

mysql_errno() 
mysql_error() 

CI nội bộ sử dụng các chức năng này.

Đối với tôi việc thực hành tốt nhất là sử dụng trong lớp cơ sở custom Model của (BaseModel)

$this->db->_error_number(); 

và xác định lỗi, ném tới ngoại lệ với thông báo lỗi thông tin lấy từ

$this->db->_error_message(); 

Tất cả các mẫu của bạn bắt nguồn từ BaseModel và phương thức gọi để kiểm tra yêu cầu cuối cùng cho lỗi db và Mô hình của bạn phải xử lý ngoại lệ và xử lý nó (có thể là nhật ký bổ sung), tất nhiên bạn có thể thực hiện kết quả kiểm tra dưới dạng giá trị kết quả và tránh ném ngoại lệ.

+0

tôi cũng sử dụng chức năng này. BaseModel đó là ý tưởng hay, và tôi nghĩ về nó. Cảm ơn. Phương thức ngoại lệ IMO ném với ngoại lệ xử lý mô hình có chút khó khăn và không minh bạch. Tôi cần lỗi xử lý đơn giản ngay lập tức sau khi chạy truy vấn. Hơn tôi cần phải thực hiện decission dựa trên _error_number() – drnk

+0

Đó không phải là nhà xây dựng, nhưng câu trả lời tốt. – Zack

0

Tôi có một gợi ý khác nhau cho điều này tôi sẽ đề nghị này

$this->form_validation->set_rules('email', 'Email', 'required|max_length[32]|valid_email|callback_email_available'); 

khi nộp mẫu đơn bạn cần xác định quy tắc. luôn luôn sử dụng callbacks để tương tác với cơ sở dữ liệu

phương pháp

public function email_available($str) 
{ 
    // You can access $_POST variable 
    $this->load->model('mymodel'); 
    $result = $this->mymodel->emailAvailability($_POST['email']); 
    if ($result) 
    { 
     $this->form_validation->set_message('email_available', 'The %s already exists'); 
     return FALSE; 
    }else{ 
     return TRUE; 
    } 
} 

Và mô hình phương pháp điều khiển callback

public function emailAvailability($email) 
{ 
    $this->db->where('email',$email); 
    $query = $this->db->get('tablename'); 
    return $query->row(); 
} 

cách này bạn sẽ luôn luôn tránh các lỗi cơ sở dữ liệu ở mặt trước và có thể được sử dụng nhìn thấy mọi thứ trong một cách tốt hơn. bạn không phải xử lý các lỗi db vì việc xác thực biểu mẫu đang xử lý mọi thứ cho bạn.

Các vấn đề liên quan