2011-10-20 14 views
47

C'è un modo per rendere CI gettare un un'eccezione quando incontra un errore di DB invece di visualizzare un messaggio del tipo:CodeIgniter: come rilevare gli errori DB?

un errore di database si era verificato Numero di errore: 1054 Unknown colonna 'foo 'in 'where clause' SELECT * FROM (FooBar) dOVE foo = '1'

NOTA: voglio solo che questo accada in un controller. Negli altri controller, sono felice che visualizzi i messaggi di errore DB.

risposta

47

Prova queste funzioni CI

$this->db->_error_message(); (mysql_error equivalent) 
$this->db->_error_number(); (mysql_errno equivalent) 
+3

E quando le domande a creato dinamicamente, '$ this-> db-> last_query()' anche utile. – uzsolt

+6

Come impediscono la visualizzazione dei messaggi? – StackOverflowNewbie

+7

È necessario disattivare il debug per il database in config/database.php -> $ db ['default'] ['db_debug'] = FALSE; – decebal

23

Forse questo:

$db_debug = $this->db->db_debug; //save setting 

$this->db->db_debug = FALSE; //disable debugging for queries 

$result = $this->db->query($sql); //run query 

//check for errors, etc 

$this->db->db_debug = $db_debug; //restore setting 
13

È necessario attivare il debug off per il database in config/database.php ->

$db['default']['db_debug'] = FALSE; 

E 'meglio per la sicurezza del tuo sito.

2

Utilizzare lo

$this->db->_error_message(); 

E 'meglio per trovare error.After completare il vostro sito. Chiudere i messaggi di errore usarlo

$db['default']['db_debug'] = FALSE; 

Si cambierà in database.php della cartella config

9

So che questo thread è vecchio, ma solo nel caso ci sia qualcun altro abbia questo problema. Questo è un trucco che ho usato senza toccare le classi db CI. Lascia il tuo debug e nel tuo file di visualizzazione degli errori, genera un'eccezione.

Così in voi db config, si ha:

$db['default']['db_debug'] = true; 

Poi, nel tuo db file di visualizzazione errore, il mio è in application/errors/error_db.php sostituire tutti i contenuti con il seguente:

<?php 
$message = preg_replace('/(<\/?p>)+/', ' ', $message); 
throw new Exception("Database error occured with message : {$message}"); 

?> 

Poiché il file di visualizzazione verrà chiamato, l'errore verrà sempre generato come eccezione, è possibile aggiungere successivamente visualizzazioni diverse per ambienti diversi.

23

In Codeigniter 3.0 (CI3), tutto quello che dovete fare è $this->db->error()

Se avete bisogno di ottenere l'ultimo errore che si è verificato, il metodo di errore() restituirà una matrice contenente il suo codice e il messaggio

http://www.codeigniter.com/user_guide/database/queries.html#handling-errors

+1

Thx! Non menzionano questo nella loro guida alla migrazione di CI 2 -> 3! – user3319803

+0

Wonderful , mi hai salvato la giornata .. Lo stavo ancora facendo da CI 2 – Neri

1

inserire questo codice in un file chiamato MY_Exceptions.php nella cartella/core dell'applicazione:

<?php 

if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

/** 
* Class dealing with errors as exceptions 
*/ 
class MY_Exceptions extends CI_Exceptions 
{ 

    /** 
    * Force exception throwing on erros 
    */ 
    public function show_error($heading, $message, $template = 'error_general', $status_code = 500) 
    { 
     set_status_header($status_code); 

     $message = implode("/", (!is_array($message)) ? array($message) : $message); 

     throw new CiError($message); 
    } 

} 

/** 
* Captured error from Code Igniter 
*/ 
class CiError extends Exception 
{ 

} 

Si farà tutti gli errori codeigniter da trattare come eccezione (CiError). Poi, girare tutto il vostro di debug database su:

$db['default']['db_debug'] = true; 
4

Ho creato una libreria semplice per questo:

<?php 
defined('BASEPATH') OR exit('No direct script access allowed'); 

class exceptions { 

    public function checkForError() { 
     get_instance()->load->database(); 
     $error = get_instance()->db->error(); 
     if ($error['code']) 
      throw new MySQLException($error); 
    } 
} 

abstract class UserException extends Exception { 
    public abstract function getUserMessage(); 
} 

class MySQLException extends UserException { 
    private $errorNumber; 
    private $errorMessage; 

    public function __construct(array $error) { 
     $this->errorNumber = "Error Code(" . $error['code'] . ")"; 
     $this->errorMessage = $error['message']; 
    } 

    public function getUserMessage() { 
     return array(
      "error" => array (
       "code" => $this->errorNumber, 
       "message" => $this->errorMessage 
      ) 
     ); 
    } 

} 

La query di esempio:

function insertId($id){ 
    $data = array(
     'id' => $id, 
    ); 

    $this->db->insert('test', $data); 
    $this->exceptions->checkForError(); 
    return $this->db->insert_id(); 
} 

E posso prendere in questo modo nel mio controller:

try { 
    $this->insertThings->insertId("1"); 
} catch (UserException $error){ 
    //do whatever you want when there is an mysql error 

} 
Problemi correlati