web-dev-qa-db-fra.com

CodeIgniter - comment réparer les erreurs de base de données?

Existe-t-il un moyen de forcer CI à lancer une exception lorsqu'il rencontre une erreur DB au lieu d'afficher un message du type:

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

REMARQUE: je souhaite que cela ne se produise que dans un seul contrôleur. Dans les autres contrôleurs, je suis heureux qu'il affiche les messages d'erreur DB.

56

Essayez ces fonctions de CI

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

Peut être ça:

$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
33
RayJ

Dans Codeigniter 3.0 (CI3), tout ce que vous avez à faire est $this->db->error()

Si vous devez obtenir la dernière erreur survenue, la méthode error () renverra un tableau contenant son code et son message.

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

25
CodeGodie

Vous devez désactiver le débogage pour la base de données dans config/database.php -> 

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

C'est mieux pour la sécurité de votre site Web. 

15
Kabir Hossain

Je sais que ce fil est ancien, mais juste au cas où quelqu'un d'autre aurait ce problème. C’est un truc que j’ai utilisé sans toucher aux classes de base de données CI. Laissez votre débogage sur et dans votre fichier de vue d'erreur, émettez une exception.

Donc, dans votre configuration, vous avez: 

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

Ensuite, dans votre fichier de vue d'erreur de base de données, le mien est dans application/errors/error_db.php et remplacez tout le contenu par ce qui suit:

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

?>

Etant donné que le fichier de vue sera appelé, l'erreur sera toujours levée à titre d'exception. Vous pourrez ensuite ajouter différentes vues pour différents environnements.

11
tlogbon

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

}

L'exemple de requête:

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

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

Et je peux le comprendre 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

 }
4
da1lbi3

Utilise le

    $this->db->_error_message(); 

Il est préférable de rechercher une erreur.Après avoir terminé votre site . Fermez les messages d'erreur .__

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

Vous allez le changer dans le fichier database.php de votre dossier de configuration 

2
Kabir Hossain

Placez 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 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;
2
Adriano Gonçalves

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

Meilleur

1
dlg_

Si on utilise PDO, en plus de toutes les réponses ci-dessus.

J'enregistre mes erreurs en silence comme ci-dessous

        $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']);

        }
0
blumanski

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