Gibt es eine Möglichkeit, CI eine exception auszulösen, wenn ein DB-Fehler auftritt, anstatt eine Meldung wie folgt anzuzeigen:
Ein Datenbankfehler ist aufgetreten. Fehlernummer: 1054 Unbekannte Spalte 'foo' in 'where-Klausel' SELECT * FROM (
FooBar
) WHEREfoo
= '1'
HINWEIS: Ich möchte, dass dies nur in einem Controller geschieht. In den anderen Controllern freue ich mich, dass die DB-Fehlermeldungen angezeigt werden.
Probieren Sie diese CI-Funktionen aus
$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
Vielleicht das:
$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
In Codeigniter 3.0 (CI3) müssen Sie lediglich $this->db->error()
Wenn Sie den zuletzt aufgetretenen Fehler abrufen müssen, gibt die error () - Methode ein Array mit Code und Nachricht zurück
http://www.codeigniter.com/user_guide/database/queries.html#handling-errors
Sie müssen das Debugging für die Datenbank in config/database.php -> deaktivieren
$db['default']['db_debug'] = FALSE;
Es ist besser für die Sicherheit Ihrer Website.
Ich weiß, dass dieser Thread alt ist, aber für den Fall, dass jemand anderes dieses Problem hat. Dies ist ein Trick, den ich verwendet habe, ohne die CI-Datenbankklassen zu berühren. Lassen Sie Ihr Debugging in und in Ihrer Fehleransicht-Datei und geben Sie eine Ausnahme aus.
In Ihrer DB-Konfiguration haben Sie also:
$db['default']['db_debug'] = true;
In Ihrer DB-Fehleransicht-Datei befindet sich meine in application/errors/error_db.php
, und ersetzen Sie den gesamten Inhalt durch Folgendes:
<?php
$message = preg_replace('/(<\/?p>)+/', ' ', $message);
throw new Exception("Database error occured with message : {$message}");
?>
Da die View-Datei aufgerufen wird, wird der Fehler immer als Ausnahme ausgegeben. Sie können später andere Ansichten für verschiedene Umgebungen hinzufügen.
Ich habe dafür eine einfache Bibliothek erstellt:
<?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
)
);
}
}
Die Beispielabfrage:
function insertId($id){
$data = array(
'id' => $id,
);
$this->db->insert('test', $data);
$this->exceptions->checkForError();
return $this->db->insert_id();
}
Und ich kann es in meinem Controller so fangen:
try {
$this->insertThings->insertId("1");
} catch (UserException $error){
//do whatever you want when there is an mysql error
}
Benutze es
$this->db->_error_message();
Es ist besser, nach Fehlern zu suchen
$db['default']['db_debug'] = FALSE;
Sie ändern es in der Datei database.php Ihres Konfigurationsordners
Fügen Sie diesen Code in eine Datei namens MY_Exceptions.php im Ordner application/core ein:
<?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
{
}
Alle Code Igniter-Fehler werden als Ausnahme (CiError) behandelt. Aktivieren Sie dann Ihren gesamten Datenbank-Debugging:
$db['default']['db_debug'] = true;
ein Beispiel, das für mich funktioniert hat:
$query = "some buggy sql statement";
$this->db->db_debug = false;
if([email protected]$this->db->query($query))
{
$error = $this->db->error();
// do something in error case
}else{
// do something in success case
}
...
Beste
Wenn man PDO verwendet, zusätzlich zu allen obigen Antworten.
Ich protokolliere meine Fehler lautlos wie folgt
$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']);
}
Deaktivieren Sie das Debuggen von Fehlern.
$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;
}