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
) WHEREfoo
= '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.
Essayez ces fonctions de CI
$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
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
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
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.
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.
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
}
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
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;
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
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']);
}
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;
}