77 votes

CodeIgniter - comment attraper les erreurs DB ?

Y a-t-il un moyen de faire CI lancer un exception lorsqu'il rencontre un Erreur de DB au lieu d'afficher un message comme :

Une erreur de base de données s'est produite Numéro d'erreur : 1054 Colonne 'foo' inconnue dans la clause 'where' SELECT * FROM ( FooBar ) OÙ foo = '1'

REMARQUE : je ne veux que cela se produise que dans un seul contrôleur. Dans les autres contrôleurs, je suis content qu'il affiche l'élément Messages d'erreur de la DB .

10voto

dlg_ Points 37

Un exemple qui a fonctionné pour moi :

$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
}
...

Best

7voto

da1lbi3 Points 1302

J'ai créé une bibliothèque simple pour cela :

<?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 requête d'exemple :

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

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

Et je peux l'attraper de cette façon dans mon contrôleur :

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

 }

4voto

Mettez ce code dans un fichier appelé MY_Exceptions.php dans le dossier application/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
{

}

Toutes les erreurs de Code Igniter seront traitées comme des exceptions (CiError). Ensuite, activez tous les débogages de votre base de données :

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

2voto

Kabir Hossain Points 324

Utilisez-le

    $this->db->_error_message(); 

C'est mieux pour trouver l'erreur. Après avoir terminé votre site. Fermez les messages d'erreur en l'utilisant

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

Vous devez le modifier dans le fichier database.php de votre dossier de configuration.

1voto

the_martux Points 835

Désactiver le débogage des erreurs.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X