CodeIgniter – cómo coger DB errores?

Hay una manera de hacer CI lanzar un excepción cuando se encuentra con una DB error en lugar de mostrar un mensaje como:

Una Base De Datos De Error Número De Error: 1054
Columna desconocido ‘foo’ en ‘cláusula where’ SELECT * FROM (FooBar) DONDE foo = ‘1’

NOTA: sólo quiero que esto suceda en un controlador. En los otros controladores, estoy feliz por él para mostrar el DB mensajes de error.

12 Kommentare

  1. 64

    Tratar estos CI funciones

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

    ACTUALIZACIÓN

    Funciones están en desuso, utilizar el error de «()» lugar:

    $this->db->error(); 
    • Y cuando las consultas son dinámicamente creado, $this->db->last_query() útil también.
    • ¿Cómo evitar que los mensajes se muestren?
    • Usted debe girar a la depuración de la base de datos en config/database.php -> $db[‘default’][‘db_debug’] = FALSE;
    • Por qué no es posible el uso de Excepción en su lugar 🙁 ?
    • Estoy con Thomas, yo realmente había una manera de conseguir estos lanzar excepciones por defecto.
    • Estos métodos han sido removidos de CodeIgniter versión 3. Uso $this->db->error() lugar. (consulte codeigniter.com/user_guide/database/…)
    • En mi humilde opinión Esto no responde a la pregunta. el display_error función termina con exit(8) por lo tanto, usted no puede coger la excepción. La única manera es deshabilitar db_debug como otras respuestas dijo.
    • Estoy de acuerdo. Esta respuesta es terrible, y de ninguna manera las direcciones de la OP. Creo que RayJ la respuesta podría ser mejor.
    • Alguien puede ayudar con el manejo de sqliteerror para la base de datos bloqueada uso de CI gracias. sólo necesito un controlador para este tipo de error gracias

  2. 37

    Tal vez esto:

    $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
    • esto ayudó mucho a la hora de usar pdo controlador para psql
    • Alguna idea de por qué db_debug la «producción» de ENTORNO valor predeterminado ('db_debug' => (ENVIRONMENT !== 'production') se establece en FALSE en fresco descargado CI v3? Veo que se ajuste a falso mostrará db error más detalles, que no se espera en la producción, a la derecha? Estoy confundido.
    • En primer lugar, debemos dar un paso atrás a la principal index.php archivo y ver cómo el AMBIENTE es el conjunto y el por qué. stackoverflow.com/questions/36051146/… Como todos sabemos, esto puede establecer que para lo que sea: define(‘medio AMBIENTE’, ‘desarrollo’) : para mostrar errores en el desarrollo. define(‘medio AMBIENTE’, ‘producción’) : cuando el sitio es en vivo. Por lo que la línea (en la database.php config) dice: ‘db_debug’ => (medio AMBIENTE !== la «producción»), O el Conjunto de la base de datos el modo debug a TRUE si «medio AMBIENTE» no está ajustado en «producción».
  3. 28

    De Codeigniter 3.0 (CI3), todo lo que tienes que hacer es $this->db->error()

    Si usted necesita para obtener el último error que se ha producido el error() método devuelve un array que contiene su código y el mensaje

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

    • Thx! No menciona esto en su CI 2 -> 3 guía de migración!
    • Maravilloso, usted salvó mi día.. yo todavía estábamos haciendo como de CI 2
    • Codeigniter detiene la ejecución del código y salidas de un mensaje de error si tiene un error, así que usted no tendrá oportunidad de comprobar $this->db->el error. Esta respuesta es incorrecta.
    • CodeIgniter sólo detiene la ejecución si config/database.php’s $db['default']['db_debug'] es cierto. Consulte stackoverflow.com/a/21073711/25507.
  4. 15

    Debe activar la depuración de la base de datos en config/database.php ->

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

    Es mejor para su sitio web de seguridad.

    • vives en un mundo paralelo ?
  5. 12

    Sé que este hilo es viejo, pero por si acaso hay alguien más tiene este problema. Este es un truco que he utilizado sin tocar el CI db clases. Deje su depuración y, en su error de archivo de vista, lanzar una excepción.

    Manera en que usted db config, se tiene :

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

    A continuación, en su db error de archivo de vista, el mío es en application/errors/error_db.php reemplazar todo el contenido con el siguiente:

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

    Desde el punto de vista de archivo será llamado, el error siempre va a ser expulsado como una excepción, usted puede añadir más tarde vistas diferentes para diferentes medio ambiente.

  6. 4

    He creado una sencilla biblioteca para que:

    <?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 consulta de ejemplo:

    function insertId($id){
        $data = array(
            'id' => $id,
        );
    
        $this->db->insert('test', $data);
        $this->exceptions->checkForError();
        return $this->db->insert_id();
    }

    Y puedo captar de esta manera en mi controlador:

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

    Poner este código en un archivo llamado MY_Exceptions.php en aplicación/carpeta core:

    <?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
    {
    
    }

    Va a hacer todo el Código Encendedor que los errores se tratan como Excepción (CiError). A continuación, gire a toda su base de datos de depuración en:

    $db['default']['db_debug'] = true;
  8. 3

    un ejemplo que trabajó para mí:

    $query = "some buggy sql statement";
    
    $this->db->db_debug = false;
    
    if(!@$this->db->query($query))
    {
        $error = $this->db->error();
        //do something in error case
    }else{
        //do something in success case
    }
    ...

    Mejor

  9. 2

    Uso

        $this->db->_error_message(); 

    Es mejor para encontrar el error.Después de completar su sitio.
    Cerca de los mensajes de error
    utilizando

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

    Que va a cambiar en tu config de la carpeta database.php

  10. 0

    Deshabilitar la depuración de errores.

        $data_user = $this->getDataUser();
        $id_user   = $this->getId_user();
    
        $this->db->db_debug = false;
        $this->db->where(['id' => $id_user]);
        $res = $this->db->update(self::$table, $data_user['user']);
    
        if(!$res)
        {
            $error = $this->db->error();
            return $error;
            //return array $error['code'] & $error['message']
        }
        else
        {
            return 1;
        }
  11. -1

    Si se usa el PDO, adicional a todas las respuestas de arriba.

    Puedo registrar mis errores en silencio como a continuación

            $q = $this->db->conn_id->prepare($query);
    
            if($q instanceof PDOStatement) {
               //go on with bind values and execute
    
            } else {
    
              $dbError = $this->db->error();
              $this->Logger_model->logError('Db Error', date('Y-m-d H:i:s'), __METHOD__.' Line '.__LINE__, 'Code: '.$dbError['code'].' -  '.'Message: '.$dbError['message']);
    
            }
  12. -1

    En sybase_driver.php

    /**
    * Manejador de Mensajes de Error Sybase
    * Autor: Isaí Moreno
    * Fecha: 06/Nov/2019
    */
    
    static  $CODE_ERROR_SYBASE;
    
    public static function SetCodeErrorSybase($Code) {
        if ($Code != 3621) {  /*No se toma en cuenta el código de command aborted*/
            CI_DB_sybase_driver::$CODE_ERROR_SYBASE = trim(CI_DB_sybase_driver::$CODE_ERROR_SYBASE.' '.$Code);       
        }
    }
    
    public static function GetCodeErrorSybase() {               
        return CI_DB_sybase_driver::$CODE_ERROR_SYBASE;
    }
    
    public static function msg_handler($msgnumber, $severity, $state, $line, $text)
    {       
        log_message('info', 'CI_DB_sybase_driver - CODE ERROR ['.$msgnumber.'] Mensaje - '.$text);
        CI_DB_sybase_driver::SetCodeErrorSybase($msgnumber);   
    }
    
    //------------------------------------------------------------------------

    Agregar y modificar los métodos siguientes en el mismo sybase_driver.php archivo

    /**
     * The error message number
     *
     * @access  private
     * @return  integer
     */
    function _error_number()
    {
        //Are error numbers supported?
        return CI_DB_sybase_driver::GetCodeErrorSybase();
    }
    
    function _sybase_set_message_handler()
    {
        //Are error numbers supported?     
        return sybase_set_message_handler('CI_DB_sybase_driver::msg_handler');
    }

    Implementar en la función de un controlador.

    public function Eliminar_DUPLA(){       
        if($this->session->userdata($this->config->item('mycfg_session_object_name'))){     
            //***/
            $Operacion_Borrado_Exitosa=false;
            $this->db->trans_begin();
    
            $this->db->_sybase_set_message_handler();  <<<<<------- Activar Manejador de errores de sybase
            $Dupla_Eliminada=$this->Mi_Modelo->QUERY_Eliminar_Dupla($PARAMETROS);                   
    
            if ($Dupla_Eliminada){
                $this->db->trans_commit();
                MostrarNotificacion("Se eliminó DUPLA exitosamente","OK",true);
                $Operacion_Borrado_Exitosa=true;
            }else{
                $Error = $this->db->_error_number();  <<<<----- Obtengo el código de error de sybase para personilzar mensaje al usuario    
                $this->db->trans_rollback();                
                MostrarNotificacion("Ocurrio un error al intentar eliminar Dupla","Error",true);
                if ($Error == 547) {
                    MostrarNotificacion("<strong>Código de error :[".$Error.']. No se puede eliminar documento Padre.</strong>',"Error",true);
                }  else {                   
                    MostrarNotificacion("<strong>Código de Error :[".$Error.']</strong><br>',"Error",true);                 
                }
            }
    
            echo "@".Obtener_Contador_Notificaciones();
            if ($Operacion_Borrado_Exitosa){
                echo "@T";
            }else{
                echo "@F";
            }
        }else{
            redirect($this->router->default_controller);
        }
    
    }

    En el registro puede comprobar los códigos y mensajes enviados por el servidor de base de datos.

    INFO - 2019-11-06 19:26:33 -> CI_DB_sybase_driver - CODE ERROR [547] Message - Dependent foreign key constraint violation in a referential integrity constraint. dbname = 'database', table name = 'mitabla', constraint name = 'FK_SR_RELAC_REFERENCE_SR_mitabla'. INFO - 2019-11-06 19:26:33 -> CI_DB_sybase_driver - CODE ERROR [3621] Message - Command has been aborted. ERROR - 2019-11-06 19:26:33 -> Query error: - Invalid query: delete from mitabla where ID = 1019.
    • Por favor responda en inglés, ya que es un sitio web en inglés!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea