2009-04-09 12 views
5

Ho una tabella con una chiave univoca (date + userid) nel mio database di applicazioni Web. Quando provo ad inserire record con esistente date e userid ricevo il seguente errore:Best practice per l'elaborazione degli errori dal database in CodeIgniter

dupicate key in table 

ho acceso il debugger database in configurazione dell'applicazione, perché avevo bisogno di usare numeri di errore MySQL e messaggi. Ora ho bisogno di elaborare questo errore. Posso usare costanti hard coded nel controller, ma penso che non sia una buona idea. Ho bisogno di gestire gli errori del database in molti posti, e non mi piace la gestione degli errori di CodeIgniter. Qual è una best practice riguardante l'elaborazione degli errori del database.

risposta

9

che usiamo nelle nostre costruzioni di progetto come questi:

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

ma questo funzioni non documentate e nelle prossime releases questo potrebbe cambiare. Naturalmente si può semplicemente utilizzare PHP standard per la funzione di maniglia errore mysql:

mysql_errno() 
mysql_error() 

internamente CI utilizzare queste funzioni.

Per quanto mi riguarda la pratica migliore è l'uso in classe di base del modello personalizzato (BaseModel)

$this->db->_error_number(); 

e determinare l'errore, eccezione tiro successivo con messaggio di errore informazioni prese dal

$this->db->_error_message(); 

Tutto il tuo modello derivato da BaseModel e metodo call per controllare l'ultima richiesta di errore db e il tuo Modello deve gestire l'eccezione ed elaborarlo (potrebbe essere anche log), ovviamente puoi implementare il risultato del controllo come valore del risultato ed evitare di generare eccezioni.

+0

l'utente anche questa funzione. BaseModel è una buona idea, e ci penso. Grazie. Il metodo di eccezione di lancio IMO con l'eccezione di gestione modello è un po 'difficile e non trasparente. Ho bisogno di errori di elaborazione semplici subito dopo l'esecuzione della query. Di quanto ho bisogno di fare decission contare su _error_number() – drnk

+0

Quelli non sono costruttori, ma una buona risposta. – Zack

0

Ho un suggerimento diverso per questo io vi consiglio questo

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

mentre l'invio del modulo è necessario definire le regole. utilizzare sempre callback per interagire con i database di

metodo

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

E il modello metodo di callback controller

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

questo modo avrai sempre evitare errori di database sulla parte anteriore e può ottenere all'utente di vedere le cose in un modo migliore. non devi gestire gli errori db perché la validazione dei moduli sta gestendo tutto per te.

Problemi correlati